Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定序列T是否是序列S在O(n)时间内的排序_Algorithm_Sorting_Big O_Sequence - Fatal编程技术网

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

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中的每个元素,检查它是否存在

我知道人们可以很容易地确定一个序列是否在O(n)时间内排序。然而,我们如何确保某些序列T确实是O(n)时间内序列S中元素的排序

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

  • 获取
    S
    的长度
    L
  • 同时检查
    T
    的长度。如果他们不同,你就完了
  • Hs
    成为一个散列映射,其中包含
    S
    中所有元素的
    2L
    存储桶
  • Ht
    成为
    T
    中所有元素的哈希映射(同样,使用
    2L
    bucket)
  • 对于
    T
    中的每个元素,检查它是否存在于
    Hs
  • 对于
    S
    中的每个元素,检查它是否存在于
    Ht
  • 如果元素在每个序列中都是唯一的,那么这将起作用。请参阅wcdolphin的答案,了解使其能够处理非唯一序列所需的小更改


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

    虽然Emil的答案很好,但你可以做得稍微好一点

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

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

    迭代T中的每个元素,减少当前元素出现的次数

    如果出现次数为零,请将其从哈希中删除


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

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

    验证对于输入序列中的每个字符,排序序列的哈希映射是否包含作为键的字符,以及作为值的计数是否相同。

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

  • 假设用于存储元素的数据结构是一个链表,用于删除元素的最小操作
  • 您将对T的每个元素执行一个S.contains(T的元素),并检查它们的大小是否相同
  • 您不能假设s是有序的,因此需要对每个元素进行逐个元素的比较
  • 最坏的情况是S与T相反
  • 这意味着,对于T的元素(0+x),如果删除每个成功的元素,您将进行(n-x)比较
  • 这将导致(n*(n+1))/2个操作,即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具有N无穷大。@Heathunnicutt:由于通常
    2n
    p(N)
    是线性的,所以它衰减回
    O(1)
    [同样,在平均情况下,在摊销分析中]@amit-N是渐近的,你知道这意味着什么吗?你关于2nk,否则它不是O(),而是θ()。如果你真的是指O()分析,它在N中是渐近的,那么你的问题就没有O(N)解了。多年过去了,没有答案能够(检查并?)利用t进行排序。它是