Python程序在预期线性时间内从列表中选择第n个最小元素
当需要在线性时间复杂度内从列表中选择第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”方法被调用到其中一个列表上。
输出显示在控制台上。
广告