时间复杂度 - O(n ^ 2)到O(n log n)搜索

时间:2015-09-26 15:10:56

标签: algorithm search big-o time-complexity

我有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)时间内完成相同的任务。我不是在寻找修复或者有人为我编写代码,我只是在寻找方向。

2 个答案:

答案 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排序的执行速度可能比合并排序更快,但这实际上取决于您的数据。