एक बिलिबिली वीडियो यह भी दिखाता है: [बिलिबिली वीडियो][https://www.bilibili.com/video/BV16u4m1c7cU/?spm_id_from=333.999.0.0] और मुझे लगता है कि यह एक अच्छा वीडियो है, लेकिन इसकी भाषा चीनी है।
समय जटिलता इस बात का माप है कि किसी एल्गोरिदम को उसके इनपुट के आकार के आधार पर चलने में कितना समय लगता है। यह एक एल्गोरिदम की दक्षता का वर्णन करने का एक तरीका है, और इसका उपयोग विभिन्न एल्गोरिदम की तुलना करने और यह निर्धारित करने के लिए किया जाता है कि कौन सा सबसे कुशल है।
समय जटिलता की गणना कैसे करें?
समय जटिलता की गणना करने के लिए, हमें इनपुट के आकार के एक फ़ंक्शन के रूप में एल्गोरिदम द्वारा किए गए संचालन की संख्या पर विचार करने की आवश्यकता है। ऑपरेशनों की संख्या को मापने का सबसे आम तरीका किसी विशेष ऑपरेशन को निष्पादित करने की संख्या की गणना करना है।
समय जटिलता की गणना करते समय कुछ सामान्य नुकसान क्या हैं?
यहां एक प्रश्न है:
किसी सूची में अधिकतम 10 पूर्णांक खोजें।
import random ls = [random.randint(1, 100) for _ in range(n)]
यहां परीक्षण फ़ंक्शन है:
import time def benchmark(func, *args) -> float: start = time.perf_counter() func(*args) end = time.perf_counter() return end - start
यहां वह समाधान है जो heapq मॉड्यूल का उपयोग करता है:
def find_max_n(ls, n): import heapq return heapq.nlargest(n, ls)
या हम इसे पायथन तरीके से लिखते हैं:
def find_largest_n(nums, n): if n max_heap[0]: max_heap[0] = num _sift_down(max_heap, 0) return max_heap def _sift_down(heap, index): left = 2 * index 1 right = 2 * index 2 largest = index if left heap[largest]: largest = left if right heap[largest]: largest = right if largest != index: heap[index], heap[largest] = heap[largest], heap[index] _sift_down(heap, largest)
यहां वह समाधान है जो सॉर्ट फ़ंक्शन का उपयोग करता है:
def find_max_n(ls, n): return sorted(ls, reverse=True)[:n]
लगभग सभी लोग जानते हैं कि ढेर की समय जटिलता O(n log k) है, और सॉर्ट फ़ंक्शन की समय जटिलता O(n log n) है।
ऐसा लगता है कि पहला समाधान दूसरे से बेहतर है। लेकिन पायथन में यह सच नहीं है।
अंतिम कोड देखें:
import time def benchmark(func, *args) -> float: start = time.perf_counter() func(*args) end = time.perf_counter() return end - start def find_max_n_heapq(ls, n): import heapq return heapq.nlargest(n, ls) def find_max_n_python_heap(nums, n): if n max_heap[0]: max_heap[0] = num _sift_down(max_heap, 0) return max_heap def _sift_down(heap, index): left = 2 * index 1 right = 2 * index 2 largest = index if left heap[largest]: largest = left if right heap[largest]: largest = right if largest != index: heap[index], heap[largest] = heap[largest], heap[index] _sift_down(heap, largest) def find_max_n_sorted(ls, n): return sorted(ls, reverse=True)[:n] # test import random for n in range(10, 10000, 100): ls = [random.randint(1, 100) for _ in range(n)] print(f"n = {n}") print(f"Use Heapq: {benchmark(find_max_n_heapq, ls, n)}") print(f"Python Heapq: {benchmark(find_max_n_python_heap, ls, n)}") print(f"Sorted : {benchmark(find_max_n_sorted, ls, n)}")
मैं इसे Python3.11 VScode में चलाता हूं, परिणाम यह है:
Heapq का उपयोग करें: 0.002430099993944168
पायथन हीपक: 0.06343129999004304
क्रमबद्ध: 9.280000813305378e-05
एन = 910
Heapq का उपयोग करें: 9.220000356435776e-05
पायथन हीपक: 0.07715500006452203
क्रमबद्ध : 9.360001422464848e-05
एन = 920
Heapq का उपयोग करें: 9.440002031624317e-05
पायथन हीपक: 0.06573969998862594
क्रमबद्ध: 0.00012450001668184996
एन = 930
Heapq का उपयोग करें: 9.689992293715477e-05
पायथन हीपक: 0.06760239996947348
क्रमबद्ध: 9.66999214142561e-05
एन = 940
Heapq का उपयोग करें: 9.600003249943256e-05
पायथन हीपक: 0.07372559991199523
क्रमबद्ध : 9.680003859102726e-05
एन = 950
Heapq का उपयोग करें: 9.770004544407129e-05
पायथन हीपक: 0.07306570000946522
क्रमबद्ध: 0.00011979998089373112
एन = 960
Heapq का उपयोग करें: 9.980006143450737e-05
पायथन हीपक: 0.0771204000338912
क्रमबद्ध: 0.00022829999215900898
एन = 970
हीपक का उपयोग करें: 0.0001601999392732978
पायथन हीपक: 0.07493270002305508
क्रमबद्ध: 0.00010840001050382853
एन = 980
Heapq का उपयोग करें: 9.949994273483753e-05
पायथन हीपक: 0.07698320003692061
क्रमबद्ध: 0.000103000008580088615
एन = 990
Heapq का उपयोग करें: 9.979994501918554e-05
पायथन हीपक: 0.0848745999392122
क्रमबद्ध: 0.00012620002962648869
एन = 10000
हीपक का उपयोग करें: 0.003642000025138259
पायथन हीपक: 9.698883199947886
क्रमबद्ध: 0.00107999995816499
एन = 11000
हीपक का उपयोग करें: 0.0014836000045761466
पायथन हीपक: 10.537632800056599
क्रमबद्ध: 0.0012236000038683414
एन = 12000
हीपक का उपयोग करें: 0.001384599949233234
पायथन हीपक: 12.328411899972707
क्रमबद्ध: 0.0013226999435573816
एन = 13000
हीपक का उपयोग करें: 0.0020017001079395413
पायथन हीपक: 15.637207800056785
क्रमबद्ध: 0.0015075999544933438
एन = 14000
हीपक का उपयोग करें: 0.0017026999266818166
पायथन हीपक: 17.298848500009626
क्रमबद्ध: 0.0016967999981716275
एन = 15000
हीपक का उपयोग करें: 0.0017773000290617347
पायथन हीपक: 20.780625900020823
क्रमबद्ध: 0.0017105999868363142
जब n बड़ा होता है, तो Sorted में थोड़ा समय लगता है (कभी-कभी heapq के उपयोग से भी बेहतर), लेकिन Python Heapq में बहुत अधिक समय लगता है।
बुलिट-इन फ़ंक्शन heapq से तेज़ है क्योंकि यह C में लिखा गया है, जो एक संकलित भाषा है।
जब हम बड़े डेटा के साथ काम कर रहे हैं, तो हमें अपने कोड के प्रदर्शन को बेहतर बनाने के लिए heapq.sort() के बजाय अंतर्निहित फ़ंक्शन का उपयोग करना चाहिए। बड़े डेटा के साथ काम करते समय हमें समय जटिलता के खतरों से सावधान रहना चाहिए। कभी-कभी समय जटिलता के नुकसान अपरिहार्य होते हैं, लेकिन हमें यथासंभव उनसे बचने का प्रयास करना चाहिए।
हैलो, मैं मेंगकिनयुआन हूं। मैं एक छात्र हूँ। मुझे नई चीजें सीखना पसंद है।
आप मेरा जीथब देख सकते हैं: [मेंगक्यूइनयुआन का जीथब][https://github.com/mengqinyuan]
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3