Algorithm 检查两个数字列表是否相等

Algorithm 检查两个数字列表是否相等,algorithm,Algorithm,给定两个数字列表A、B。有没有更好的方法来检查它们是否等于O(N^2)解。如果您的意思是,两个列表包含相同的数字,而与排序无关,则可以使用以下O(N*logn)算法: 以相同的方式对两个列表进行排序(例如升序) 从顶部开始逐项比较结果列表 步骤(1)需要2*O(n*logn)=O(n*logn)时间。第二步以线性O(n)时间运行 因此,运行上述算法可以在O(n*logn)time中解决您的问题。如果您的意思是,两个列表包含相同的数字,而与排序无关,则可以使用以下O(n*logn)算法: 以相同的

给定两个数字列表A、B。有没有更好的方法来检查它们是否等于O(N^2)解。

如果您的意思是,两个列表包含相同的数字,而与排序无关,则可以使用以下
O(N*logn)
算法:

  • 以相同的方式对两个列表进行排序(例如升序)
  • 从顶部开始逐项比较结果列表
  • 步骤(1)需要
    2*O(n*logn)=O(n*logn)
    时间。第二步以线性
    O(n)
    时间运行


    因此,运行上述算法可以在
    O(n*logn)
    time中解决您的问题。

    如果您的意思是,两个列表包含相同的数字,而与排序无关,则可以使用以下
    O(n*logn)
    算法:

  • 以相同的方式对两个列表进行排序(例如升序)
  • 从顶部开始逐项比较结果列表
  • 步骤(1)需要
    2*O(n*logn)=O(n*logn)
    时间。第二步以线性
    O(n)
    时间运行


    因此,运行上述算法可以在
    O(n*logn)
    时间内解决您的问题。

    假设数字在列表上排序,并且两个列表的长度相同:

    bool eq = true;
    
    for (int i = 0; i < list1.length; i++) {
        if (list1[i] != list2[i]) {
            eq = false;
            last;
        }
    }
    
    bool eq=true;
    for(int i=0;i
    假设数字在列表上排序,并且两个列表的长度相同:

    bool eq = true;
    
    for (int i = 0; i < list1.length; i++) {
        if (list1[i] != list2[i]) {
            eq = false;
            last;
        }
    }
    
    bool eq=true;
    for(int i=0;i
    首先检查它们的长度是否相等。如果是,您可以将A的数字放入哈希集中。迭代B并检查它是否在HashSet中。如果有,您可以从HashSet中删除它。如果HashSet最后为空,则它们相等。这是O(n)


    实际上,HashSet中不允许重复,因此可以使用一个HashMap,key作为数字,value作为计数。算法保持不变。每次在HashMap递减计数中发现一个B数。如果HashMap最后为空,则它们相等。这也是O(n)。

    首先检查它们的长度是否相等。如果是,您可以将A的数字放入哈希集中。迭代B并检查它是否在HashSet中。如果有,您可以从HashSet中删除它。如果HashSet最后为空,则它们相等。这是O(n)

    实际上,HashSet中不允许重复,因此可以使用一个HashMap,key作为数字,value作为计数。算法保持不变。每次在HashMap递减计数中发现一个B数。如果HashMap最后为空,则它们相等。这也是O(n)。

    对两个列表进行排序O(nlogn)
    然后同时检查这两个数字,看它们是否包含相同的数字O(n)

    总计:O(nlogn)对两个列表进行排序O(nlogn)
    然后同时检查这两个数字,看它们是否包含相同的数字O(n)


    总计:O(nlogn)

    定义“相等”。同样的订单?重复的元素?你的意思是“有没有更好的方法来检查它们是否包含相同的数字?”在我的书中,列表平等要求数字都相同,并且顺序相同,我认为这需要O(n)运算来检查。列表有什么特殊的特征吗?它们分类了吗?数字有界吗?此外,是否允许使用非恒定量的额外内存?定义“相等”。同样的订单?重复的元素?你的意思是“有没有更好的方法来检查它们是否包含相同的数字?”在我的书中,列表平等要求数字都相同,并且顺序相同,我认为这需要O(n)运算来检查。列表有什么特殊的特征吗?它们分类了吗?数字有界吗?此外,是否允许使用非常量的额外内存?如果数字是整数,则可以使用时间复杂度为O(n)的桶排序算法(更精确地说,时间复杂度为O(n+r),r是数字的范围),将问题简化为O(n)+O(n)+O(n)=O(n)复杂度或
    O(n*log(r))的二进制基数排序
    ,此时
    r
    为可表示的最大值,而不是实际存在的最大值。如果数字是整数,你可以使用时间复杂度为O(n)(更准确地说,时间复杂度是O(n+r),r是数字的范围),将问题简化为O(n)+O(n)+O(n)=O(n)复杂度或二进制基数排序
    O(n*log(r))
    ,此时,
    r
    是可表示的最大值,而不是实际存在的最大值。可以就地完成,很好。谢谢。我也想出了O(n*logn)算法,但我喜欢urs!!谢谢我也喜欢:)。如果你能接受我的答案(同样只有在你喜欢的情况下:)会有帮助,特别是因为(令人惊讶的是)没有人比我更高的票数:)。谢谢。我也想出了O(n*logn)算法,但我喜欢urs!!谢谢我也喜欢:)。如果你能接受我的答案(同样只有在你喜欢的情况下:)那会有帮助,特别是因为(令人惊讶的)没有人比我的更高:)。