কেউ আগ্রহী হলে পাইথনে আমি একটি সহজ সমাধান লিখেছি। এটি bisect
মডিউল এবং একটি অস্থায়ী রিটার্নের তালিকা ব্যবহার করে যা এটি বাছাই করে। এটি একটি অগ্রাধিকার সারি বাস্তবায়নের অনুরূপ।
import bisect
def kLargest(A, k):
'''returns list of k largest integers in A'''
ret = []
for i, a in enumerate(A):
# For first k elements, simply construct sorted temp list
# It is treated similarly to a priority queue
if i < k:
bisect.insort(ret, a) # properly inserts a into sorted list ret
# Iterate over rest of array
# Replace and update return array when more optimal element is found
else:
if a > ret[0]:
del ret[0] # pop min element off queue
bisect.insort(ret, a) # properly inserts a into sorted list ret
return ret
100,000,000 উপাদান এবং সবচেয়ে খারাপ ক্ষেত্রে ইনপুট যা ব্যবহার করা হয় তা অনুসারে বাছাই করা তালিকা:
>>> from so import kLargest
>>> kLargest(range(100000000), 100)
[99999900, 99999901, 99999902, 99999903, 99999904, 99999905, 99999906, 99999907,
99999908, 99999909, 99999910, 99999911, 99999912, 99999913, 99999914, 99999915,
99999916, 99999917, 99999918, 99999919, 99999920, 99999921, 99999922, 99999923,
99999924, 99999925, 99999926, 99999927, 99999928, 99999929, 99999930, 99999931,
99999932, 99999933, 99999934, 99999935, 99999936, 99999937, 99999938, 99999939,
99999940, 99999941, 99999942, 99999943, 99999944, 99999945, 99999946, 99999947,
99999948, 99999949, 99999950, 99999951, 99999952, 99999953, 99999954, 99999955,
99999956, 99999957, 99999958, 99999959, 99999960, 99999961, 99999962, 99999963,
99999964, 99999965, 99999966, 99999967, 99999968, 99999969, 99999970, 99999971,
99999972, 99999973, 99999974, 99999975, 99999976, 99999977, 99999978, 99999979,
99999980, 99999981, 99999982, 99999983, 99999984, 99999985, 99999986, 99999987,
99999988, 99999989, 99999990, 99999991, 99999992, 99999993, 99999994, 99999995,
99999996, 99999997, 99999998, 99999999]
এটি 100,000,000 উপাদানগুলির জন্য এটি গণনা করতে প্রায় 40 সেকেন্ড সময় নিয়েছে তাই আমি 1 বিলিয়ন ডলার এটি করতে ভয় পাচ্ছি। যদিও ন্যায়পরায়ণভাবে বলতে গেলে, আমি এটিকে সবচেয়ে খারাপ ক্ষেত্রে ইনপুট খাচ্ছিলাম (হাস্যকরভাবে একটি অ্যারে যা ইতিমধ্যে সাজানো হয়েছে)।