কম্পিউটার টিউটোরিয়াল

পাইথন প্রোগ্রাম: লিস্ট থেকে n-তম বড় এলিমেন্ট বের করা (এক্সপেক্টেড লিনিয়ার টাইম)


ভূমিকা

একটি আনসোর্টেড লিস্ট থেকে k-তম বড় এলিমেন্ট (k-th largest) বের করার জন্য কুইকসিলেক্ট (Quickselect) অ্যালগরিদম ব্যবহার করা হয়, যার এভারেজ টাইম কমপ্লেক্সিটি O(n)। এটি কুইকসোর্টের পার্টিশন লজিকের সাদৃশ্য।

উদাহরণ কোড

def select_largest(my_list, beg, end, i):
    if end - beg <= 1:
        return my_list[beg]
    pivot_val = start_partition(my_list, beg, end)
    k = end - pivot_val
    if i < k:
        return select_largest(my_list, pivot_val + 1, end, i)
    elif i > k:
        return select_largest(my_list, beg, pivot_val, i - k)
    return my_list[pivot_val]

def start_partition(my_list, beg, end):
    pivot_val = my_list[beg]
    i = beg + 1
    j = end - 1
    while True:
        while (i <= j and my_list[i] <= pivot_val):
            i = i + 1
        while (i <= j and my_list[j] >= pivot_val):
            j = j - 1
        if i <= j:
            my_list[i], my_list[j] = my_list[j], my_list[i]
        else:
            my_list[beg], my_list[j] = my_list[j], my_list[beg]
            return j

my_list = input('Enter the list of numbers.. ')
my_list = my_list.split()
my_list = [int(x) for x in my_list]
i = int(input('Enter the value for i.. '))
ith_largest = select_largest(my_list, 0, len(my_list), i)
print('The result is {}.'.format(ith_largest))

আউটপুট

Enter the list of numbers.. 34 67 12 0 999
Enter the value for i.. 1
The result is 999.

ব্যাখ্যা

  • select_largest: রিকার্সিভ ফাংশন। i = k-তম বড় (1-বেসড)।

  • start_partition: হোয়ারের পার্টিশন স্কিম (Hoare's partition)। পিভট = প্রথম এলিমেন্ট। دو পয়েন্টার i (বাম) এবং j (ডান) থেকে স্ক্যান করে পিভটের সঠিক পজিশন বের করে।

  • k = end - pivot_val: পিভটের ডান পাশে (বড় মানগুলোর পাশে) কতগুলো এলিমেন্ট আছে।

  • যদি i < k: কাঙ্ক্ষিত এলিমেন্ট ডান পাশে, সেখানে রিকার্সন।

  • যদি i > k: বাম পাশে, এডজাস্টেড i দিয়ে রিকার্সন।

  • যদি i == k: পিভটই কাঙ্ক্ষিত এলিমেন্ট।

দ্রষ্টব্য

  • ইনপুট i=1 মানে সবচেয়ে বড় (1st largest)। i=2 মানে ২য় বড়।

  • ওয়ার্স্ট কেস O(n²) (পিভট খারাপ হলে)। র‍্যান্ডোমাইজড পিভট ব্যবহার করলে এভারেজ O(n) নিশ্চিত।

  • পাইথনে বিল্ট-ইন: heapq.nlargest(k, lst)[-1] বা sorted(lst, reverse=True)[k-1] (O(n log n))।


  1. পাইথন প্রোগ্রাম অ্যারেতে সবচেয়ে বড় এলিমেন্ট বের করা

  2. পাইথনে লিস্ট থেকে ডুপ্লিকেট এলিমেন্ট সরানো

  3. পাইথন লিস্ট থেকে ন্যূনতম মানবিশিষ্ট উপাদান খুঁজে বের করার পদ্ধতি

  4. পাইথন লিস্ট থেকে সর্বোচ্চ মানবিশিষ্ট উপাদান খুঁজে বের করার পদ্ধতি