【问题标题】:Sorting an array and indexOf() runtime对数组和 indexOf() 运行时进行排序
【发布时间】:2017-09-02 01:56:37
【问题描述】:

假设array.indexOf() 从数组的开头进行线性搜索是否安全?

所以如果我经常搜索最大值,在调用indexOf之前对数组进行排序会使其运行更快吗?

注意事项:

我只想排序一次并搜索多次。

“最大值”实际上是最流行的搜索键,它是一个字符串。

【问题讨论】:

  • 如果要对其进行排序,则不应使用indexOf,而应使用二进制搜索
  • 嗯...对数组进行排序需要的不仅仅是线性时间...但是如果您排序一次并搜索几次可能有意义...那么您应该再次使用类似 max 的东西如果您只需要最大值,则使用堆......如果需要查找不同的值,则使用二叉搜索树。
  • 好吧,我所说的“max”实际上是最流行的搜索键,它是一个字符串,是的,我只想排序一次。 @JCOC611
  • 您可以使用哈希表或地图。
  • 您的应用程序真的优化得非常好并且足够密集,以至于需要这种级别的优化吗?如果没有,请执行任何更易于阅读和维护的操作,然后在发生性能问题时对其进行故障排除。

标签: javascript arrays performance ecmascript-6 ecmascript-5


【解决方案1】:

是的,indexOf 是从第一个到最后一个。在随后询问第一个条目之前对其进行排序会在性能上有所不同,具体取决于排序算法的性能。通常快速排序中的 O(N log N) 到线性搜索中的 O(n)。我建议您使用随机值计数对其进行简单测试,看看性能如何。

当然,这取决于您的 DataObject: 数组列表:

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

也许 TreeSet 也可以帮助你一直到它的有序。

最后我会说:“取决于您的数据容器以及如何实现排序或搜索以及需要整个过程中的性能”。

正如评论所说,对于纯数组,您可以制作具有与快速排序相同的性能影响的 binarySearch。

因此,最后不仅是算法性能的问题,还包括您在什么时候需要该过程中的性能。例如,如果您有很多时间通过添加值而没有时间获得所需的值,那么排序结构可以很好地改进它,例如 Tree-Collections。如果您需要通过添加东西来获得更高的性能,则可能相反。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2020-05-07
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多