我可以向你保证, < strong> 函数 < code>strcmp 是ABSOLUITY 而不是瓶颈 strong > 。 通常, strcmp 是最优化的, 可以对字符串进行32或64位比特的比较, 字符串长度超过 4/8 字节, 取决于建筑结构。 新lib 和 GNU libc 都这样做。 但是, 即使您用两个字符串来查看每个字节, 20 次, 也和这里所做的 algo & amp; 数据结构选择一样重要 。
真正的瓶颈是 O(N) 搜索算法 。 在文件上的单 O(Nlog N) 通过可用于进行 O(log N) 搜索的适当数据结构( 无论是正常的 BST 、 trie 、 还是简单排序的阵列 ) 。
在此,许多数学都随之而来。但我认为这是一个很好的机会来说明为什么选择算法 & amp; 数据结构有时比字符串比较方法更为重要。 Steve提到了这一点,但我想更深入地解释一下。
N=1e6,对数(1e6,2)=19.9,因此对理想数据结构进行20次比较。
您正在对 O( N) 或 1e6 操作进行最差的搜索 。
所以说您只需用 O( log N) 插入时间构建一棵红黑树, 然后插入 N 项, 即 s O( N log N) 时间来构建树。 因此您需要用 s 1e6 x 20 或 20e6 操作来构建您的树 。
在目前的方法中,建立数据结构是 O(N), 或 1e6 操作, 但最差的搜索时间也是 O(N) 。 所以当您阅读文件并只做20次搜索操作时, 您的理论中最差的情况是 21,000,000 个操作。 相比之下, 您最差的情况是红树和 20 个搜索是 20,000 个操作, 或者 999, 600 操作比 O( N) 搜索未分类的阵列要好。 因此, 在 20 个搜索中, 您会发现一个更复杂的数据结构真正能起作用的起始点 。 但是看看1000 搜索中发生的情况 :
未分类阵列=初始化+1000x搜索时间=O(N)+1000 *O(N)=1,000,000+2,000,000=2,001,000,000操作。
红色-黑色 = 初始化+ 1000 x 搜索时间 = O(Nlog N) + 1000 * O(log N) = 20,000,000 + 20,000 = 20,020,000 操作。
2 001 000 000 / 20 020 000 100x O(N) 搜索作业次数。
At 1e6 搜索, s (1e6 + 1e6 * 1e6) / (20e6 + 1e6 * 20) = 25 000x 作业。
假设您的计算机能处理40e6操作, 也就是在1分钟内进行对数 N 搜索所需的40e6操作。 使用您目前的算法, 需要25,000分钟或17天才能做同样的工作。 或者另一种方法来查看, O( N) 搜索算法只能在 O( log N) 算法能够完成 1 000 000 时处理39次搜索。 越多搜索, 搜索就会越难看。
Steve 和 dirkgently 对数据结构 & amp; 算法的几种更好的选择做出回应。 我唯一的额外告诫是, Steve < em> might em > 建议的 < code> < qsort () code > 具有O( N*N) 最坏的复杂情况, 远比您用堆积或各种树状结构得到的 O( Nlog N) 还要糟糕。