Python 程序在预期线性时间内从列表中选择第 n 个最小元素

pythonserver side programmingprogramming

当需要以线性时间复杂度从列表中选择第 n 个最小元素时,需要两种方法。一种方法是找到最小元素,另一种方法将列表分成两部分。此划分取决于用户给出的 ‘i’ 值。根据此值,拆分列表并确定最小元素。

下面是相同的演示 −

示例

def select_smallest(my_list, beg, end, i):
   if end - beg <= 1:
      return my_list[beg]
   pivot_val = start_partition(my_list, beg, end)

   k = pivot_val - beg + 1

   if i < k:
      return select_smallest(my_list, beg, pivot_val, i)
   elif i > k:
      return select_smallest(my_list, pivot_val + 1, end, 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_smallest = select_smallest(my_list, 0, len(my_list), i)
print('The result is {}.'.format(ith_smallest))

输出

Enter the list of numbers.. 43 12 67 89 99 0
Enter the value for i.. 3
The result is 43.

解释

  • 定义了一个名为‘select_smallest’的方法,该方法以列表、开头、结尾和一个‘i’值作为参数。

  • 定义了另一个名为‘start_partition’的方法,该方法根据‘i’的值将列表分为两部分。

  • 此方法在‘select_smallest’方法中调用。

  • ‘select_smallest’也会在同一个函数中再次被调用 - 这就是递归的工作方式。

  • 数字作为用户的输入。

  • 它根据默认值进行拆分。

  • 它被迭代。

  • ‘i’ 的值来自用户。

  • 根据这个‘i’ 值,列表被分成两部分。

  • 在其中一个列表上调用‘select_smallest’ 方法。

  • 输出显示在控制台上。


相关文章