【问题标题】:How would I optimize this look for unique number Algorithm function [duplicate]我将如何优化这个寻找唯一数字算法函数[重复]
【发布时间】:2015-09-20 00:25:27
【问题描述】:

对于课堂上的这个算法作业,我必须在 1000x250 二维数组中找到所有唯一值。

数据在 2000000 到 2200000 之间。所有数据都存储在一个名为 data 的 2D int 数组中。

我遇到的问题是运行它需要一些时间,我的教授说我们不能使用其他数据集,而且我们需要优化我们的代码,以便它以良好的速度运行。

    int[] uniqueValues = new int[200000];
    boolean isUnique = true;
    int uniqueCounter = 0;

     for (int i = 0; i < data.length; i++) {

         for (int j = 0; j < data[i].length; j++) {

            for (int x = 0; x < uniqueCounter; x++) {

                if (data[i][j] != uniqueValues[x]) {
                    isUnique = true;
                } else {
                    isUnique = false;
                    break;
                }

            }

            if (isUnique) {
                uniqueValues[uniqueCounter] = data[i][j];
                uniqueCounter++;
            }

        }
}

【问题讨论】:

  • 这个问题应该去代码审查:codereview.stackexchange.com
  • “我的教授说我们不能使用其他数据集” - 这没有意义。可能你翻译错了。他实际上说了什么?
  • 你应该使用 Set。如果不允许使用预定义的 Set 实现,则应创建自己的 Set 数据结构。
  • 另外,你的“教授”有没有说你必须优化它? '因为他的(明显的)指示不创建单独的数据结构使得明显有效的解决方案变得不可能。我怀疑他希望你在这个练习中了解数组和循环......而且这种“让它快速运行”是一个非要求,你不应该浪费你的时间。

标签: java algorithm optimization unique


【解决方案1】:

好吧,如果你为结果分配了 200000 个整数,你可以将它们用作每个值的计数器,然后收集只出现一次的那些:

for (int i = 0; i < data.length; i++) {
  for (int j = 0; j < data[i].length; j++) {
    uniqueValues[data[i][j] - 2000000]++;
  }
}        

int uniqueCounter = 0; 
for (int i = 0; i < uniqueValue.length; i++) {
  if (uniqueValues[i] == 1) {
    uniqueValues[uniqueCounter++] = i + 2000000;
  }
}

【讨论】:

  • @rsutormin 在这种情况下,值不会是唯一的......
  • 对!我理解错了任务。
猜你喜欢
  • 2018-02-22
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 2023-03-03
  • 2023-03-25
  • 2011-11-20
  • 2011-02-08
  • 2015-11-26
相关资源
最近更新 更多