确定序列T是否是O(n)时间内序列S的排序

时间:2012-04-01 21:04:52

标签: algorithm sorting sequence linear

我知道可以很容易地确定序列是否在O(n)时间内排序。但是,我们如何确保某些序列T确实是在O(n)时间内从序列S中对元素进行排序?

也就是说,某人可能有一个算法输出一些确实按排序顺序的序列T,但可能不包含序列S中的任何元素,那么我们如何检查T确实是O中的S的排序序列( n)时间?

4 个答案:

答案 0 :(得分:2)

  1. 获取L的长度S
  2. 同时检查T的长度。如果它们不同,那就完成了!
  3. Hs成为哈希地图,其中包含2L中所有元素的S个桶。
  4. Ht成为2L中所有元素的哈希映射(同样,T个桶)。
  5. 对于T中的每个元素,请检查它是否存在于Hs
  6. 对于S中的每个元素,请检查它是否存在于Ht
  7. 如果元素在每个序列中都是唯一的,那么这将起作用。请参阅wcdolphin的答案,了解使其与非唯一序列一起使用所需的微小变化。

    我没有考虑内存消耗。创建两个大小为每个序列的两个hashmap可能很昂贵。这是速度和记忆之间的通常权衡。

答案 1 :(得分:1)

虽然埃米尔的答案非常好,但你可以做得更好。

基本上,为了使T成为S的重新排序,它必须包含所有相同的元素。也就是说,对于T或S中的每个元素,它们必须出现相同的次数。因此,我们将:

创建S中所有元素的哈希表,从“元素”映射到出现次数。

遍历T中的每个元素,减少当前元素发生的次数。

如果出现次数为零,则将其从散列中删除。

如果当前元素不在散列中,则T不是S的重新排序。

答案 2 :(得分:0)

创建两个序列的哈希映射。将字符用作键,将字符的计数用作值。如果尚未添加某个字符,请将其添加为1.如果已添加某个字符,则将其计数增加1.

验证输入序列中的每个字符,排序序列的哈希映射是否包含字符作为键,并且具有与值相同的计数。

答案 3 :(得分:0)

我认为这是一个O(n ^ 2)问题,因为:

  1. 假设用于存储元素的数据结构是一个链接列表,用于删除元素的最小操作
  2. 你将为T的每个元素做一个S.contains(T元素),并检查它们是否相同。
  3. 您不能假设s是有序的,因此需要对每个元素进行逐元素比较。
  4. 最坏的情况是如果S与T
  5. 相反
  6. 这意味着对于T的元素(0 + x),如果删除每个成功的元素,你会进行(n-x)比较。
  7. 这导致(n *(n + 1))/ 2次操作,即O(n ^ 2)
  8. 可能是其他一些更聪明的算法