回答

收藏

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

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

这是一段 C   代码显示了一些非常奇怪的行为。出于某种奇怪的原因,对数据进行排序(在定时区域之前)奇迹般地使循环快了近 6 倍。# L1 k9 g  \! M+ L* }* V
[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>(排序本身比遍历数组需要更多的时间,所以如果我们需要计算未知数组,它实际上不值得这样做。/ J* l- o- ^7 H: z+ U" J3 h: P) F
起初,我认为这可能只是一种语言或编译器异常,所以我尝试了 Java:. o4 Q7 P) y, I( S, q) ~, R
[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]结果类似但不那么极端。  |1 b' X% J9 q
我的第一个想法是将数据排序到缓存中,但后来我认为这是多么愚蠢,因为数组刚刚生成。* k0 U) L$ V! M2 [/ X2 [/ c3 P
到底是怎么回事?+ y1 C' H  l7 c
为什么处理排序数组比处理未排序数组快?
代码总结了一些独立的术语,所以顺序应该无关紧要。
( T+ Q' G% S% m; z9 |+ ?5 i                                                               
1 I% Q  U; h5 W$ D    解决方案:                                                                5 f; C1 n9 p( s; i: B9 d
                                                                对于排序数组,条件data[c] >= 128首先false是连续值,然后true是所有的后续值。这很容易预测。您需要支付未排序数组的分支费用。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则