回答

收藏

为什么处理排序数组比处理未排序数组更快?

技术问答 技术问答 657 人阅读 | 0 人回复 | 2023-09-11

这是一段 C   代码显示了一些非常奇怪的行为。出于某种奇怪的原因,对数据进行排序(在定时区域之前)奇迹般地使循环快了近 6 倍。
8 @1 J6 b- T/ h2 ]3 _; R5 y[code]#include #include #include <i>int main()()()()()(///)()()()()()(()()()()()())()()(////)())()()()())()()()///////)()()()())())()())()())())()()()()()()()())()()()()()()())()()()())()()()()()()())()()())()()()())()()()()()()()()()()()()//////)/)/)/)()()()()()()()()()()())()())())())()())()())()())()())()())()()())()())()()()()()())()))()))()))()())())())())()()()())()))()))())())()))()()))()()()))()()()))())())()))())()()())())()))())))))())))()()))())))())))()))()())()())()))()))()()()()()))())))))())())()()()()()))))()))())))))()))))()))())()()))))())()()()()()()()())()))()////////)))))))))))))()))))))))()))))))()()()()()()()())))Generate data    const unsigned arraySize =   int data[arraySize];    for (unsigned c = 0; c =         sum  = data[c];         double elapsedTime = static_cast(clock()-start) / CLOCKS_PER_SEC;    std::cout 使用排序数据后,代码运行时间为 1.93 秒。</u>(排序本身比遍历数组需要更多的时间,所以如果我们需要计算未知数组,它实际上不值得这样做。
5 M' d: f  j9 Z5 [! c/ g5 n7 Y起初,我认为这可能只是一种语言或编译器异常,所以我尝试了 Java:
+ S  _% {8 `# L4 y8 q, V* ~[code]import java.util.Arrays;import java.util.Random;public class Main{    public static void main(String[] args)           Generate data        int arraySize =     int data[] = new int[arraySize];        Random rnd = new Random(0);       for (int c = 0; c =          sum  = data[c];                                               System.out.println((System.nanoTime() - start) / 1000000000.0);System.out.println(&quot;sum = &quot;   sum);  code]结果类似但不那么极端。, Q1 h4 n9 T6 v$ J& d
我的第一个想法是将数据排序到缓存中,但后来我认为这是多么愚蠢,因为数组刚刚生成。
# ^% U! `+ @+ l7 t8 c到底是怎么回事?. Z, s! Q3 l4 ?6 U, ~! _
为什么处理排序数组比处理未排序数组快?
代码总结了一些独立的术语,所以顺序应该无关紧要。/ i4 M0 I  H4 D
                                                               
1 k& a4 t/ S: p4 \4 F6 s    解决方案:                                                               
4 W3 k5 W5 I8 `+ \- R9 Y8 _                                                                对于排序数组,条件data[c] >= 128首先false是连续值,然后true是所有的后续值。这很容易预测。您需要支付未排序数组的分支费用。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则