线性时间内列表中非重复元素的最小值

时间:2018-10-15 05:44:07

标签: algorithm list traversal

给出一个未排序的数字列表(可以是int或double),给出一种算法,以遍历列表和线性时间来找到最小的非重复元素。 (没有空间限制)

例如

Given list is [2, 7, 9, 5, 2, 8, 3, 5, 1, 5, 6, 1]   
Non-repeating elements are [7, 9, 8, 3, 6]  
Min non-repeating element is 3

我通过创建两个散列集来尝试此操作,一个散列集用于存储非重复散列元素,另一个散点集用于存储非重复散列集的最小值。在某些情况下,这可以使我有线性的时间,但在所有情况下都不能。

谢谢。

2 个答案:

答案 0 :(得分:2)

首先,找到所有非重复项,例如具有key = item和value = occurrences的哈希图。

接下来,遍历hashmap并找到值为1的最小键。

这在O(2n)中是线性的

答案 1 :(得分:-1)

使用斐波那契堆(FH)-最小

  • 将堆\ theta(1)摊销。
  • 在摊销中插入\ theta(1)。
  • Find_Minimum \ theta(1)摊销。
  • 提取的Min_iminim O(log n)已摊销。
  • Increase_Key \ theta(1)摊销。

for i in L
   If i == Find_Min(FH)                // O(1) since the min in the top of the list.
     Increase_key(min(FH), the_max_number)// \theta(1) in amortized.
   else
     Insert(FG)                       // \theta(1) in amortized.
if Find_Min(FH) == the_max_number
   return nil
else
   return Find_Min(FH)

使用增加键设置为the_max_number代替Extract_The_Mininimum

您将有Theta(n)摊销成本。请参阅第18章的Cormen,Leiserson和Rivest的《算法简介》第三版。