我有n
个项目的无序列表,我正在尝试查找该列表中最常用的项目。我写了以下代码:
def findFrequant(L):
count = int()
half = len(L)//2
for i in L:
for j in L:
if i == j:
count += 1
if count > half:
msg = "The majority vote is {0}".format(i)
return msg
else:
continue
count = 0
return "mixed list!"
显然这个带有两个循环的过程是O(n^2)
,我正试图在O(n log n)
时间内完成相同的任务。我不是在寻找修复或者有人为我编写代码,我只是在寻找方向。
答案 0 :(得分:3)
我不认识这里的语言所以我将其视为伪代码。
这取决于具有相同类型的L元素和值类型int的键的散列表。计算哈希表中的每条记录,然后将哈希表迭代为应用正常maxlist算法的键值对的正常集合。
O(n)略差于线性。我们记得,良好散列的费用不是线性的,但可以近似为线性。使用的线性空间。
def findFrequant(L):
hash = [,]
vc = 0
vv = null
for i in L
if hash.contains(i)
hash[i] = hash[i] + 1
else
hash[i] = 1
for (k,v) in hash
if v > vc
vv = k
vc = v
else if v == vc
vv = null
if (vv == null)
return "mixed list!"
else
return "The majority vote is {0}".format(v)
答案 1 :(得分:0)
你可以使用Merge Sort,它的最坏情况时间复杂度为O(n log(n)),二进制搜索的最坏情况时间复杂度为O(log(n))。
有排序算法具有更快的最佳案例场景,例如冒泡排序,其中O(n)的情况最好,但合并排序在O(n log(n))中执行最差,而冒泡排序有O(n ^ 2)的最坏情况。
像我们的计算机科学家一样悲观,我们通常根据最坏情况分析。因此,在您的情况下,合并排序和二进制搜索的组合可能是最佳的。
请注意,在某些情况下,Radix排序的执行速度可能比合并排序更快,但这实际上取决于您的数据。