Algorithm 确定序列T是否是序列S在O(n)时间内的排序
我知道人们可以很容易地确定一个序列是否在O(n)时间内排序。然而,我们如何确保某些序列T确实是O(n)时间内序列S中元素的排序 也就是说,有人可能有一个算法,它输出的序列T确实是按排序的顺序排列的,但可能不包含序列S中的任何元素,那么我们如何检查T在O(n)时间内确实是S的排序序列呢Algorithm 确定序列T是否是序列S在O(n)时间内的排序,algorithm,sorting,big-o,sequence,Algorithm,Sorting,Big O,Sequence,我知道人们可以很容易地确定一个序列是否在O(n)时间内排序。然而,我们如何确保某些序列T确实是O(n)时间内序列S中元素的排序 也就是说,有人可能有一个算法,它输出的序列T确实是按排序的顺序排列的,但可能不包含序列S中的任何元素,那么我们如何检查T在O(n)时间内确实是S的排序序列呢 获取S的长度L 同时检查T的长度。如果他们不同,你就完了 让Hs成为一个散列映射,其中包含S中所有元素的2L存储桶 让Ht成为T中所有元素的哈希映射(同样,使用2Lbucket) 对于T中的每个元素,检查它是否存在
S
的长度L
T
的长度。如果他们不同,你就完了李>
Hs
成为一个散列映射,其中包含S
中所有元素的2L
存储桶Ht
成为T
中所有元素的哈希映射(同样,使用2L
bucket)T
中的每个元素,检查它是否存在于Hs
中S
中的每个元素,检查它是否存在于Ht
中我没有考虑内存消耗。创建两个大小为每个序列两倍的hashmap可能会很昂贵。这是速度和内存之间通常的折衷。虽然Emil的答案很好,但你可以做得稍微好一点 从根本上说,为了使T是S的重新排序,它必须包含所有相同的元素。也就是说,对于T或S中的每个元素,它们必须出现相同的次数。因此,我们将: 创建S中所有元素的哈希表,从“元素”映射到出现次数 迭代T中的每个元素,减少当前元素出现的次数 如果出现次数为零,请将其从哈希中删除
如果当前元素不在哈希中,则T不是S的重新排序。创建两个序列的哈希映射。将字符用作键,将字符计数用作值。如果尚未添加某个字符,请添加计数为1的字符。如果已添加字符,则将其计数增加1 验证对于输入序列中的每个字符,排序序列的哈希映射是否包含作为键的字符,以及作为值的计数是否相同。我认为这是一个O(n^2)问题,因为:
可能还有其他更聪明的算法,不过请注意,它应该是一个直方图
map:element->int
,以确保在处理重复元素时仍然得到O(n)
。除此之外-很好的解决方案。-1:哈希映射不是魔法,也不是O(1)。哈希映射与它使用的冲突处理具有相同的O()复杂性。如果哈希映射使用链接,则构建它是O(n^2)。如果哈希映射对每个bin的溢出都有一个二叉树,那么它就是O(logn)。这就是最近tomcat DoS POST漏洞背后的问题。在今天的大学里,Java“知识”作为CS教育分发,许多学生被误导,认为哈希图可以像你所描述的那样使用——但这是错误的。你必须考虑如果发生哈希冲突会发生什么。@ HethHunnCututt:你忘记读它们的最后一章了,<代码> K<代码>不是常数。负载平衡通常是~1/2-1/4
,意思是2n
,它会衰减回常数。Rehashin是O(n)
-但是在O(n)
OPS之后进行,这会返回到O(1)
每个OPHeath摊销,为什么您假设hashmap已满?头脑正常的人会用太少的bucket创建hashmap吗?我会理解你的抱怨更多,如果你指出了(几乎不可能)哈希冲突几乎每一个键或类似的东西,但具有良好的散列函数和足够大的哈希图,键碰撞应该是不可能的。我认为你也应该考虑每个元素的计数。例如,对于A=[1,1,2]和B=[1,2,2],您的解决方案将回答“是”,但答案应该是“否”。嗯?这是一个非常随机的下一票..哈希映射用于计算O(1)查找时间,它不是“魔法”,该算法应该在O(n)中工作。你能解释一下你的否决票吗?上面已经解释过了。O()是一个渐近度量。在计算O()复杂度时,哈希映射会转移到它们的链接策略中,因为当N较大时,哈希映射已满。如果允许调整哈希映射的大小,则也需要O(N)来调整大小。哈希映射没有O(1)查找时间。Hashmap有O(1/k*p(N))查找时间,其中p(N)是链式(bin溢出)策略,1/k是从O()符号中消失的常数因子。Hashmaps具有N2n
,p(N)
是线性的,所以它衰减回O(1)
[同样,在平均情况下,在摊销分析中]@amit-N是渐近的,你知道这意味着什么吗?你关于2n