এটি একটি ক্লাসিক সমস্যা যা 1986 সালে কিছুটা অনুরণন পেয়েছিল, যখন ডোনাল্ড নুথ তার সাক্ষরিত প্রোগ্রামিং কৌশলটি চিত্রিত করার জন্য 8-পৃষ্ঠার দীর্ঘ প্রোগ্রামে হ্যাশ চেষ্টা করে একটি দ্রুত সমাধান কার্যকর করেছিলেন, যখন ইউনিক্স পাইপের গডফাদার ডগ ম্যাকল্রয় একটি প্রতিক্রিয়া দিয়েছিলেন। ওয়ান-লাইনার, এটি তত দ্রুত ছিল না, তবে কাজটি সম্পন্ন করেছে:
tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn | sed 10q
অবশ্যই, ম্যাকিলারয়ের সমাধানের সময় জটিলতা ও (এন লগ এন) রয়েছে, যেখানে এন মোট শব্দ সংখ্যা। আরও দ্রুত সমাধান আছে। উদাহরণ স্বরূপ:
এখানে উপরের বাউন্ড টাইম জটিলতা ও ((এন + কে) লগ কে) সহ একটি সি ++ বাস্তবায়ন রয়েছে, সাধারণত - প্রায় রৈখিক।
নীচে হ্যাশ অভিধানের সাহায্যে দ্রুত পাইথন প্রয়োগকরণ এবং টাইম জটিলতা হে (এন + কে লগ কিউ) সহ হিপ রয়েছে, যেখানে কিউ বেশ কয়েকটি অনন্য শব্দ:
import collections, re, sys
filename = sys.argv[1]
k = int(sys.argv[2]) if len(sys.argv)>2 else 10
text = open(filename).read()
counts = collections.Counter(re.findall('[a-z]+', text.lower()))
for i, w in counts.most_common(k):
print(i, w)
সিপিইউ সময়ের তুলনা (সেকেন্ডে):
bible32 bible256
C++ (prefix tree + heap) 5.659 44.730
Python (Counter) 10.314 100.487
Sheharyar (AWK + sort) 30.864 251.301
McIlroy (tr + sort + uniq) 60.531 690.906
নোট:
- বাইবেল 32 হ'ল বাইবেল নিজেই 32 বার (135 মেগাবাইট), বাইবেল 256 - 256 বার যথাক্রমে (1.1 গিগাবাইট) সংযুক্ত।
- পাইথন স্ক্রিপ্টগুলির অ-লিনিয়ার ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে এই কারণে আসে যে এটি মেমরিতে সম্পূর্ণ ফাইলগুলি প্রক্রিয়া করে, তাই ওভারহেডগুলি বিশাল ফাইলগুলির জন্য বড় হয়ে উঠছে।
- যদি এমন কোনও ইউনিক্স সরঞ্জাম ছিল যা গাদা তৈরি করতে পারে এবং স্তূপের শীর্ষ থেকে এন উপাদানগুলি তুলতে পারে, তবে এডাব্লু কে সমাধান প্রায় লিনিয়ার সময় জটিলতা অর্জন করতে পারে, যখন বর্তমানে এটি হে (এন + কিউ লগ কিউ) রয়েছে।