【问题标题】:How to make java nested loops efficient如何使java嵌套循环高效
【发布时间】:2021-10-23 00:57:33
【问题描述】:

我目前需要编写一个程序来进行成对比较以在 int 列表中找到匹配的对,但我能想到的唯一方法是通过嵌套的 for 循环。有没有办法使时间复杂度 O(n) 而不是嵌套 for 循环的 O(n^2)?

int[] arr = new int[n];
int total = 0;
for (int i=0; i<n; i++){
    for (int j=i+1; j<n; j++){
        if (arr[i] == arr[j]){
            total++;
        }
    }
}

【问题讨论】:

  • 您可以从j=i+1 开始,您不会将每个弓与其本身进行比较,并且即使所有弓都不同,也至少有n
  • 哦,谢谢!编辑了那部分
  • 您的问题是关于时间复杂度的,但您用 memory 高效标记了它。是不是搞错了?
  • 列表中没有固定的数字。我已经编辑了时间复杂度,谢谢!
  • 不确定我得到代码的作用,例如,如果数组中充满了单个数字,让我们说所有元素都等于 1,让我们说数组长度为 5,那么总长度为 10 是什么你在找还是应该是 5 ?

标签: java arrays loops time-complexity


【解决方案1】:

看起来您只担心计数。因此,如果修改数组不是问题,那么在 O(nlog(n)) 中应用快速排序,然后在 O(n) 中计算邻居数。

【讨论】:

    【解决方案2】:

    您可以使用具有O(1) 复杂性的HashSet contains 方法-因为Java 中Integer 值的hashCode 分布良好(它只是Integer 的值)你应该有始终保持不变的复杂性

    HashSet<Integer> set = new HashSet();
    for (int i=0; i<n; i++) {
        if(set.contains(arr[i])) {
            total++;
        } else {
            set.add(arr[i]);
        }
    }
    

    在这里阅读更多:


    这里还可以实现另一种算法,但它需要一些数据限制(由于您机器上数组的最大长度)。

    您可以创建一个 int 数组 yourarray,并使用 0 进行初始化,长度为 max(arr) + 1。然后,每次执行 yourarray[arr[i]]++ 时都在迭代 arr,然后在 yourarray 上迭代,检查值在哪里大于 1 - 如果是这样,则意味着该值必须重复

    【讨论】:

      【解决方案3】:

      O(n) 解决方案。 试试这个。

      public static void main(String[] args) {
          int[] arr = {0, 1, 2, 3, 4, 3, 2, 3};
          int total = arr.length - (int)IntStream.of(arr).distinct().count();
          System.out.println(total);
      }
      

      输出:

      3
      

      【讨论】:

        【解决方案4】:

        我认为你可以使用 HashSet 来解决这个问题。 JAVA 中的 HashSet 不允许插入重复元素。所以你可以用它来让时间复杂度变成O(n)。

                int[] arr = new int[n];
                Set<Integer> set = new HashSet<Integer>();
                Integer total = 0;
                for (int x: arr)
                {
                    if (!set.add(x))
                    {
                       total++;
                    }
                }
        

        【讨论】:

        • 只是为了进一步说明,比如数组是{0,0,0},会有3对,因为1st和2nd是一对,1st and 3rd and 2nd and 3rd ,所以会有3对
        猜你喜欢
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 2020-02-10
        • 1970-01-01
        相关资源
        最近更新 更多