如何更有效地获取列表中所有记录最高的数字的索引值?

时间:2019-06-19 04:01:04

标签: python

说我有第一个清单:

list = [0, 1, 0, 4, 3, 1, 2, 5, 1, 12, 9, 32, 31, 19, 44, 3]

第一个列表中所有数字n的第二个列表,使得n = max(list [:n]),如下所示:

list_max = [0, 1, 4, 5, 12, 32, 44]

说我想获取列表中list_max的索引位置的列表,该列表应该等于:

list_max_pos = [0, 1, 3, 7, 9, 11, 14]

我可以做类似的事情:

list_max_pos = []
m = len(list_max)
for n in range (0, m):
    list_max_pos.append(list.index(list_max[n]))

问题在于,如果原始列表过长,即数百万个值长,则效率会非常低下,因为它每次都会从头开始搜索。为了节省时间,我可以开始搜索每个新值的索引,而最后一个值的索引不存在。也就是说,在列表中的位置11找到32之后,我可以从位置12开始搜索44,而不是从0开始搜索。

我将如何实施?

1 个答案:

答案 0 :(得分:3)

仅遍历列表一次就在您浏览列表时存储了索引值。这可以解决O(n)时间复杂度的问题。

inputlist = [0, 1, 0, 4, 3, 1, 2, 5, 1, 12, 9, 32, 31, 19, 44, 3]
maxvalue = -1
answer= []
for index,element in enumerate(inputlist):
    if element > maxvalue:
        maxvalue = element
        answer.append(index)
print(answer)

注意: 插入O(1)中的列表中的摊销时间复杂度。插入的渐近最坏情况运行时复杂度为O(n),平均情况为O(1)。您可以使用出队来稍微加快速度。插入出队队列的渐近和摊销的最坏情况运行时复杂度为O(1)

您可以在此处详细了解-> TimeComplexity of python datastructures

输出

[0, 1, 3, 7, 9, 11, 14]