我知道可以很容易地确定序列是否在O(n)时间内排序。但是,我们如何确保某些序列T确实是在O(n)时间内从序列S中对元素进行排序?
也就是说,某人可能有一个算法输出一些确实按排序顺序的序列T,但可能不包含序列S中的任何元素,那么我们如何检查T确实是O中的S的排序序列( n)时间?
答案 0 :(得分:2)
L
的长度S
。T
的长度。如果它们不同,那就完成了!Hs
成为哈希地图,其中包含2L
中所有元素的S
个桶。Ht
成为2L
中所有元素的哈希映射(同样,T
个桶)。T
中的每个元素,请检查它是否存在于Hs
。S
中的每个元素,请检查它是否存在于Ht
。如果元素在每个序列中都是唯一的,那么这将起作用。请参阅wcdolphin的答案,了解使其与非唯一序列一起使用所需的微小变化。
我没有考虑内存消耗。创建两个大小为每个序列的两个hashmap可能很昂贵。这是速度和记忆之间的通常权衡。
答案 1 :(得分:1)
虽然埃米尔的答案非常好,但你可以做得更好。
基本上,为了使T成为S的重新排序,它必须包含所有相同的元素。也就是说,对于T或S中的每个元素,它们必须出现相同的次数。因此,我们将:
创建S中所有元素的哈希表,从“元素”映射到出现次数。
遍历T中的每个元素,减少当前元素发生的次数。
如果出现次数为零,则将其从散列中删除。
如果当前元素不在散列中,则T不是S的重新排序。
答案 2 :(得分:0)
创建两个序列的哈希映射。将字符用作键,将字符的计数用作值。如果尚未添加某个字符,请将其添加为1.如果已添加某个字符,则将其计数增加1.
验证输入序列中的每个字符,排序序列的哈希映射是否包含字符作为键,并且具有与值相同的计数。
答案 3 :(得分:0)
我认为这是一个O(n ^ 2)问题,因为:
可能是其他一些更聪明的算法