আমি কীভাবে একটি স্বেচ্ছাসেবী ফাংশনের জন্য বিগও স্বরলিপি গণনা করব তা শেখানোর চেষ্টা করছি। আমি এই ফাংশনটি একটি পাঠ্যপুস্তকে পেয়েছি। বইটি দৃser়ভাবে জানিয়েছে যে ফাংশনটি হ'ল (এন 2 )। এটি কেন এটির একটি ব্যাখ্যা দেয় তবে আমি অনুসরণ করার জন্য লড়াই করছি। আমি ভাবছি যে কেউ যদি কেন এমন হয় এর পিছনে অঙ্কটি আমাকে দেখাতে সক্ষম হয়। মূলত, আমি বুঝতে পারি যে এটি হে (এন 3 ) এর চেয়ে কম কিছু , তবে আমি স্বাধীনভাবে ও (এন 2 ) এ অবতরণ করতে পারিনি
ধরা যাক আমাদের A, B, এবং C. এর তিনটি সংখ্যার ক্রমিক দেওয়া হয়েছে আমরা ধরে নেব যে কোনও স্বতন্ত্র অনুক্রমে সদৃশ মান নেই, তবে এমন কিছু সংখ্যার হতে পারে যা অনুক্রমের দুটি বা তিনটিতে থাকে। ত্রি-উপায়ে সেট বিচ্ছিন্নতা সমস্যাটি নির্ধারণ করা হয় যে তিনটি অনুক্রমের ছেদটি ফাঁকা আছে, যথা, x ∈ A, x ∈ B, এবং x ∈ C এর মতো কোনও এলিমেন্ট নেই that
ঘটনাচক্রে, এটি আমার কোনও হোম ওয়ার্কের সমস্যা নয় - এই জাহাজটি বহু বছর আগে যাত্রা করেছিল:), আমি আরও স্মার্ট হওয়ার চেষ্টা করছি।
def disjoint(A, B, C):
"""Return True if there is no element common to all three lists."""
for a in A:
for b in B:
if a == b: # only check C if we found match from A and B
for c in C:
if a == c # (and thus a == b == c)
return False # we found a common value
return True # if we reach this, sets are disjoint
[সম্পাদনা] পাঠ্যপুস্তক অনুসারে:
উন্নত সংস্করণে, আমরা ভাগ্যবান হলে কেবল সময় সাশ্রয় করি তা নয়। আমরা দাবি করি যে, বিজয়ী হওয়ার পক্ষে সবচেয়ে খারাপ সময়টি ও (এন 2 )।
বইটির ব্যাখ্যা, যা আমি অনুসরণ করতে সংগ্রাম করি, তা হ'ল:
সামগ্রিক চলমান সময়ের জন্য অ্যাকাউন্ট করতে, আমরা কোডের প্রতিটি লাইন কার্যকর করতে ব্যয় করা সময়টি পরীক্ষা করি। এ জন্য লুপ ওভার পরিচালনার জন্য ও (এন) সময় প্রয়োজন। লুপ ওভার বি এর পরিচালনা মোট ও (এন 2 ) সময়ের জন্য অ্যাকাউন্টগুলি , যেহেতু সেই লুপটি এন বিভিন্ন সময় কার্যকর করা হয়। পরীক্ষার a == খ ও (এন 2 ) বার মূল্যায়ন করা হয় । ব্যয় করা বাকি সময় নির্ভর করে কত মিলের (ক, খ) জোড়া বিদ্যমান pairs যেমনটি আমরা লক্ষ করেছি, সর্বাধিক n এর মতো জোড়া রয়েছে, এবং তাই C এর উপর লুপের পরিচালনা এবং সেই লুপের শরীরে থাকা আদেশগুলি সর্বাধিক ও (এন 2 ) সময় ব্যবহার করে। মোট সময় ব্যয় করা হয়েছে ও (এন 2 )।
(এবং যথাযথ ক্রেডিট দেওয়ার জন্য ...) বইটি হ'ল মাইকেল টি। গুডরিচ এট-র পাইথনে ডেটা স্ট্রাকচারস এবং অ্যালগরিদম। সমস্ত, উইলে পাবলিশিং, পৃষ্ঠা। 135
[সম্পাদনা] একটি ন্যায্যতা; নীচে অপ্টিমাইজেশনের আগে কোডটি দেওয়া হয়েছে:
def disjoint1(A, B, C):
"""Return True if there is no element common to all three lists."""
for a in A:
for b in B:
for c in C:
if a == b == c:
return False # we found a common value
return True # if we reach this, sets are disjoint
উপরের অংশে, আপনি পরিষ্কার দেখতে পাচ্ছেন যে এটি হে (এন 3 ), কারণ প্রতিটি লুপ অবশ্যই তার সম্পূর্ণরূপে চালানো উচিত। বইটি দৃsert়ভাবে দাবি করবে যে সরল উদাহরণে (প্রথম দেওয়া) তৃতীয় লুপটি কেবলমাত্র O (n 2 ) এর জটিলতা, সুতরাং জটিলতা সমীকরণটি কে + ও (এন 2 ) + ও (এন 2 ) হিসাবে যায় যা শেষ পর্যন্ত ফল দেয় ও (এন 2 )
যদিও আমি প্রমাণ করতে পারি না এটি কেস (এইভাবে প্রশ্ন), পাঠক একমত হতে পারেন যে সরলিকৃত অ্যালগরিদমের জটিলতা মূলের চেয়ে কমপক্ষে কম।
[সম্পাদনা] এবং সরলিকৃত সংস্করণটি চতুর্ভুজ প্রমাণ করার জন্য:
if __name__ == '__main__':
for c in [100, 200, 300, 400, 500]:
l1, l2, l3 = get_random(c), get_random(c), get_random(c)
start = time.time()
disjoint1(l1, l2, l3)
print(time.time() - start)
start = time.time()
disjoint2(l1, l2, l3)
print(time.time() - start)
উৎপাদনের:
0.02684807777404785
0.00019478797912597656
0.19134306907653809
0.0007600784301757812
0.6405444145202637
0.0018095970153808594
1.4873297214508057
0.003167390823364258
2.953308343887329
0.004908084869384766
দ্বিতীয় পার্থক্য সমান হওয়ায় সরলীকৃত কার্যটি প্রকৃতপক্ষে চতুর্ভুজ:
[সম্পাদনা] এবং আরও প্রমাণ:
যদি আমি সবচেয়ে খারাপ ক্ষেত্রে ধরে নিই (A = B! = C),
if __name__ == '__main__':
for c in [10, 20, 30, 40, 50]:
l1, l2, l3 = range(0, c), range(0,c), range(5*c, 6*c)
its1 = disjoint1(l1, l2, l3)
its2 = disjoint2(l1, l2, l3)
print(f"iterations1 = {its1}")
print(f"iterations2 = {its2}")
disjoint2(l1, l2, l3)
উৎপাদনের:
iterations1 = 1000
iterations2 = 100
iterations1 = 8000
iterations2 = 400
iterations1 = 27000
iterations2 = 900
iterations1 = 64000
iterations2 = 1600
iterations1 = 125000
iterations2 = 2500
দ্বিতীয় পার্থক্য পরীক্ষা ব্যবহার করে, সবচেয়ে খারাপ ক্ষেত্রে ফলাফল হুবহু চতুর্ভুজ।