【问题标题】:Is this a good way to speed up array processing?这是加快数组处理的好方法吗?
【发布时间】:2014-12-19 18:06:30
【问题描述】:

所以,今天我一觉醒来就想到了这个想法。

假设您有一个一长串事物,一个数组,您必须逐一检查以找到与您要查找的内容相匹配的那个。为此,您可以使用for 循环。现在,想象一下你要找的那个几乎在列表的末尾,但你不知道。因此,在这种情况下,假设您检查列表元素的顺序并不重要,那么从最后一个元素而不是第一个元素开始会更方便节省一些时间也许还有记忆。但是,如果你的元素几乎是在开始呢?

那时我想:如果我可以同时开始检查列表两端的元素会怎样?

所以,经过几次尝试,我想出了这个原始示例代码(用 js 编写),在我看来,它可以解决我们上面定义的问题:

fx (var list) {
    var len = length(list);

    // To save some time as we were saying, we could check first if the array isn't as long as we were expecting
    if (len == 0) {
        // If it's not, then we just process the only element anyway
        /*
        ...
        list[0]
        ...
        */
        return;
    } else {
        // So, now here's the thing. The number of loops won't be the length of the list but just half of it.
        for (var i = 0; i == len/2; i++) {
            // And inside each loop we process both the first and last elements and so on until we reach the middle or find the one we're looking, whatever happens first
            /*
            ...
            list[i]
            list[len]
            ...
            */
            len--;
        }
    }

    return;
};

无论如何,我仍然不能完全确定这是否真的会加快进程或使其变慢或根本没有任何区别。这就是为什么我需要你们的帮助,伙计们。

根据您自己的经验,您怎么看?这真的是让这种过程更快的好方法吗?如果是或不是,为什么?有什么办法可以改善吗?

谢谢各位。

【问题讨论】:

  • 通常最好在发布代码时指定您使用的语言。
  • 好吧,我不是专门谈论一种语言,但你是对的。假设它写的是js,这是我觉得更舒服的那个

标签: arrays list arraylist


【解决方案1】:

您提出的算法是好的如果您知道该项目可能在开头或结尾但不在中间,如果它可能在中间则不好,并且只是过于复杂它同样可能出现在列表中的任何位置。

一般来说,如果您有 n 个项目的 未排序 列表,那么您可能必须检查所有项目,这总是需要时间,即 至少与 n 成比例(这大致是符号“O(n)”的意思)——除了从排序或部分排序的列表开始之外,没有其他方法可以解决这个问题.

在您的方案中,循环仅运行 n/2 次迭代,但它在每次迭代中所做的工作量大约是普通线性搜索(从一端到另一端)的两倍,所以总成本大致相等。

如果您确实有一个部分排序的列表(也就是说,您有一些关于该项目更有可能在哪里的信息),那么首先从最可能的位置开始是一个很好的策略。 (假设您不经常寻找根本不在列表中的项目,在这种情况下没有任何帮助。)

【讨论】:

    【解决方案2】:

    如果您从两端工作,那么当您要查找的项目靠近中间时,您将获得最差的性能。不管你做什么,顺序搜索都是 O(n)。

    如果要加快搜索列表的速度,则需要使用更好的数据结构,例如排序列表、哈希表或 B-tree。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多