আপনি হালকাভাবে নামলেন, আপনি সম্ভবত হেজ ফান্ডের জন্য কাজ করতে চান না যেখানে কোয়ান্ট্যান্ট বেসিক অ্যালগরিদমগুলি বুঝতে পারে না :-)
নেই কোন একটি ইচ্ছামত আকারের ডাটা স্ট্রাকচার প্রক্রিয়া উপায় O(1)
, যদি এই ক্ষেত্রে হিসাবে, আপনি একবার অন্তত প্রতিটি উপাদান যেতে হবে। সেরা আপনি আশা করতে পারেন O(n)
এই ক্ষেত্রে, যেখানে n
স্ট্রিং এর দৈর্ঘ্য হল।
যদিও, একটি সরাইয়া হিসাবে, একটি নামমাত্র O(n)
অ্যালগরিদম হবে হতে O(1)
তাই হয়, টেকনিক্যালি একটি নির্দিষ্ট ইনপুট আকার জন্য, তারা এখানে সঠিক ছিল। যাইহোক, এটি সাধারণত জটিলতা বিশ্লেষণগুলি কীভাবে ব্যবহার করে তা নয়।
এটি আমার কাছে মনে হচ্ছে আপনি তাদের বিভিন্ন উপায়ে মুগ্ধ করতে পারতেন।
প্রথমে তাদের জানিয়ে দিয়ে যে এটি করা সম্ভব নয়O(1)
, যদি না আপনি উপরে বর্ণিত "সন্দেহভাজন" যুক্তি ব্যবহার করেন।
দ্বিতীয়ত, পাইথোনিক কোড সরবরাহ করে আপনার অভিজাত দক্ষতা দেখিয়ে যেমন:
inpStr = '123412345123456'
# O(1) array creation.
freq = [0] * 1000
# O(n) string processing.
for val in [int(inpStr[pos:pos+3]) for pos in range(len(inpStr) - 2)]:
freq[val] += 1
# O(1) output of relevant array values.
print ([(num, freq[num]) for num in range(1000) if freq[num] > 1])
এই ফলাফলগুলি:
[(123, 3), (234, 3), (345, 2)]
যদিও আপনি অবশ্যই অবশ্যই আকাঙ্ক্ষিত যে কোনও কিছুতে আউটপুট ফর্ম্যাটটি পরিবর্তন করতে পারেন।
এবং অবশেষে, তাদের বলার মাধ্যমে সমাধানের সাথে অবশ্যই কোনও সমস্যা নেইO(n)
, কারণ উপরের কোডটি অর্ধ সেকেন্ডের নীচে দশ মিলিয়নের অঙ্কের স্ট্রিংয়ের ফলাফল সরবরাহ করে। এটি 10,000 মিলিয়ন-অক্ষরের স্ট্রিংটিতে 3.5 সেকেন্ড এবং 100,000,000-চরিত্রের ক্ষেত্রে 36 সেকেন্ড সময় নেয় বলে মনে হয় এটি বেশ লাইনগতভাবে স্কেল বলে মনে হচ্ছে।
এবং, তাদের যদি এর চেয়ে আরও ভাল প্রয়োজন হয় তবে এই ধরণের জিনিসগুলির সমান্তরাল করার উপায় রয়েছে যা এটির গতি বাড়িয়ে তুলতে পারে।
জিআইএল-এর কারণে অবশ্যই একক পাইথন দোভাষীর মধ্যে নয় , আপনি স্ট্রিংটিকে এমন কিছুতে বিভক্ত করতে পারেন ( vv
সীমানা অঞ্চলের সঠিক প্রক্রিয়াকরণের অনুমতি দেওয়ার জন্য নির্দেশিত ওভারল্যাপের প্রয়োজন):
vv
123412 vv
123451
5123456
এগুলি আপনি আলাদা কর্মী তৈরি করতে এবং ফলাফলগুলি পরে একত্রিত করতে পারেন।
ইনপুট বিভক্তকরণ এবং আউটপুট সংমিশ্রণ সম্ভবত ছোট স্ট্রিং (এবং সম্ভবত মিলিয়ন-অঙ্কের স্ট্রিং) দিয়ে যে কোনও সঞ্চয়কে জলাবদ্ধ করতে পারে তবে, আরও বড় ডেটা সেটগুলির জন্য, এটি ভালভাবে পার্থক্য করতে পারে। অবশ্যই "পরিমাপ, অনুমান করবেন না" এর আমার সাধারণ মন্ত্রটি অবশ্যই এখানে প্রয়োগ হয়।
এই মন্ত্রটি অন্যান্য সম্ভাবনার ক্ষেত্রেও প্রযোজ্য যেমন পাইথনকে পুরোপুরি বাইপাস করা এবং একটি ভিন্ন ভাষা ব্যবহার করা যা দ্রুত হতে পারে।
উদাহরণস্বরূপ, নিম্নলিখিত সি কোড, পূর্ববর্তী পাইথন কোডের মতো একই হার্ডওয়্যারে চলমান, 0.6 সেকেন্ডে একশ মিলিয়ন অঙ্ক পরিচালনা করে , প্রায় একই সময় পাইথন কোডটি এক মিলিয়ন প্রক্রিয়াজাত করে । অন্য কথায়, অনেক দ্রুত:
#include <stdio.h>
#include <string.h>
int main(void) {
static char inpStr[100000000+1];
static int freq[1000];
// Set up test data.
memset(inpStr, '1', sizeof(inpStr));
inpStr[sizeof(inpStr)-1] = '\0';
// Need at least three digits to do anything useful.
if (strlen(inpStr) <= 2) return 0;
// Get initial feed from first two digits, process others.
int val = (inpStr[0] - '0') * 10 + inpStr[1] - '0';
char *inpPtr = &(inpStr[2]);
while (*inpPtr != '\0') {
// Remove hundreds, add next digit as units, adjust table.
val = (val % 100) * 10 + *inpPtr++ - '0';
freq[val]++;
}
// Output (relevant part of) table.
for (int i = 0; i < 1000; ++i)
if (freq[i] > 1)
printf("%3d -> %d\n", i, freq[i]);
return 0;
}