自己能建設(shè)網(wǎng)站嗎貴陽(yáng)網(wǎng)站建設(shè)制作
鶴壁市浩天電氣有限公司
2026/01/24 14:04:09
自己能建設(shè)網(wǎng)站嗎,貴陽(yáng)網(wǎng)站建設(shè)制作,東莞網(wǎng)站建設(shè)定制,深圳進(jìn)入政策最新我來(lái)幫你實(shí)現(xiàn)這個(gè)尋找前100個(gè)最大數(shù)據(jù)的算法。這個(gè)算法的時(shí)間復(fù)雜度是O(n log 100)#xff0c;空間復(fù)雜度是O(100)。
C實(shí)現(xiàn)
#include iostream
#include vector
#include queue
#include functional
#include randomusing namespac…我來(lái)幫你實(shí)現(xiàn)這個(gè)尋找前100個(gè)最大數(shù)據(jù)的算法。這個(gè)算法的時(shí)間復(fù)雜度是O(n log 100)空間復(fù)雜度是O(100)。C實(shí)現(xiàn)#includeiostream#includevector#includequeue#includefunctional#includerandomusingnamespacestd;// 尋找前k個(gè)最大元素的算法vectorintfindTopK(constvectorintnums,intk){if(nums.size()k){vectorintresult(nums.begin(),nums.end());returnresult;}// 創(chuàng)建最小堆priority_queueint,vectorint,greaterintminHeap;// 步驟1: 插入前k個(gè)元素for(inti0;ik;i){minHeap.push(nums[i]);}// 步驟2-3: 遍歷剩余元素維護(hù)堆for(size_t ik;inums.size();i){if(nums[i]minHeap.top()){minHeap.pop();// 彈出堆頂minHeap.push(nums[i]);// 插入當(dāng)前元素}}// 步驟4: 堆中元素即為前k個(gè)最大數(shù)據(jù)vectorintresult;while(!minHeap.empty()){result.push_back(minHeap.top());minHeap.pop();}returnresult;}intmain(){// 生成測(cè)試數(shù)據(jù)vectorintdata(1000);random_device rd;mt19937gen(rd());uniform_int_distributiondis(1,10000);for(inti0;i1000;i){data[i]dis(gen);}intk100;vectorinttopKfindTopK(data,k);cout前k個(gè)最大元素endl;for(size_t i0;itopK.size();i){couttopK[i] ;if((i1)%100)coutendl;}coutendl;return0;}Python實(shí)現(xiàn)importheapqimportrandomfromtypingimportListdeffind_top_k(nums:List[int],k:int)-List[int]: 尋找前k個(gè)最大元素的算法 實(shí)現(xiàn)步驟 1. 創(chuàng)建一個(gè)最小堆并將前k個(gè)數(shù)據(jù)插入堆中 2. 遍歷剩余的數(shù)據(jù)如果當(dāng)前數(shù)據(jù)比堆頂大就替換堆頂元素 3. 繼續(xù)遍歷所有數(shù)據(jù)確保堆中保留的是最大的k個(gè)數(shù)據(jù) 4. 遍歷完成后堆中的元素就是前k個(gè)最大的數(shù)據(jù) iflen(nums)k:returnsorted(nums,reverseTrue)# 步驟1: 創(chuàng)建最小堆并插入前k個(gè)元素min_heapnums[:k]heapq.heapify(min_heap)# 建立最小堆# 步驟2-3: 遍歷剩余元素維護(hù)堆fornuminnums[k:]:ifnummin_heap[0]:# 如果當(dāng)前元素比堆頂大# 彈出堆頂插入當(dāng)前元素heapq.heapreplace(min_heap,num)# 步驟4: 堆中元素即為前k個(gè)最大數(shù)據(jù)# 堆是最小堆需要排序后返回resultsorted(min_heap,reverseTrue)returnresultdeffind_top_k_alternative(nums:List[int],k:int)-List[int]:另一種實(shí)現(xiàn)方式更清晰地體現(xiàn)算法步驟iflen(nums)k:returnsorted(nums,reverseTrue)# 步驟1: 創(chuàng)建最小堆并插入前k個(gè)元素min_heap[]foriinrange(k):heapq.heappush(min_heap,nums[i])# 步驟2-3: 遍歷剩余數(shù)據(jù)foriinrange(k,len(nums)):ifnums[i]min_heap[0]:# 比堆頂大# 我就往堆里面插heapq.heappop(min_heap)# 彈出堆頂heapq.heappush(min_heap,nums[i])# 插入當(dāng)前數(shù)據(jù)# 步驟4: 返回結(jié)果returnsorted(min_heap,reverseTrue)defmain():# 生成測(cè)試數(shù)據(jù)random.seed(42)data[random.randint(1,10000)for_inrange(1000)]k100# 使用方法1top_kfind_top_k(data,k)print(f前{k}個(gè)最大元素)fori,numinenumerate(top_k,1):print(f{num:6d},end )ifi%100:print()print()# 驗(yàn)證結(jié)果正確性sorted_datasorted(data,reverseTrue)[:k]print(f算法結(jié)果是否正確:{top_ksorted_data})# 使用方法2top_k2find_top_k_alternative(data,k)print(f方法2結(jié)果是否正確:{sorted(top_k2)sorted(top_k)})if__name____main__:main()算法復(fù)雜度分析時(shí)間復(fù)雜度: O(n log k)其中n是總數(shù)據(jù)量k100空間復(fù)雜度: O(k)只需要維護(hù)大小為100的堆關(guān)鍵點(diǎn)說(shuō)明使用最小堆的原因我們想要最大的k個(gè)元素使用最小堆可以讓我們?cè)贠(1)時(shí)間內(nèi)知道當(dāng)前堆中最小的元素堆頂?shù)淖饔枚秧斒冀K是當(dāng)前堆中最小的元素也就是第k大的候選者替換條件只有當(dāng)新元素大于堆頂時(shí)才進(jìn)行替換確保堆中始終是見(jiàn)過(guò)的最大的k個(gè)元素“我就往堆里面插”這個(gè)操作在代碼中體現(xiàn)為heapq.heapreplace()或先pop再push的操作兩種實(shí)現(xiàn)方式都可以Python版本提供了兩種寫法“find_top_k”使用“heapq.heapreplace()”更簡(jiǎn)潔“find_top_k_alternative”分步操作更清晰地體現(xiàn)算法步驟