【发布时间】:2018-09-19 09:49:47
【问题描述】:
我使用这两个函数从大量数据中搜索查询。一开始它们的速度差不多,但是当大小变得非常大时,二分搜索数组会稍微快一些。是因为缓存效果吗?数组有顺序。树有吗?
int binary_array_search(int array[], int length, int query){
//the array has been sorted
int left=0, right=length-1;
int mid;
while(left <= right){
mid = (left+right)/2;
if(query == array[mid]){
return 1;
}
else if(query < array[mid]){
right = mid-1;
}
else{
left = mid+1;
}
}
return 0;
}
// Search a binary search tree
int binary_tree_search(bst_t *tree, int ignore, int query){
node_t *node = tree->root;
while(node != NULL){
int data = node->data;
if(query < data){
node = node->left;
}
else if(query > data){
node =node->right;
}
else{
return 1;
}
}
return 0;
}
以下是一些结果:
LENGTH SEARCHES binary search array binary search tree
1024 10240 7.336000e-03 8.230000e-03
2048 20480 1.478000e-02 1.727900e-02
4096 40960 3.001100e-02 3.596800e-02
8192 81920 6.132700e-02 7.663800e-02
16384 163840 1.251240e-01 1.637960e-01
【问题讨论】:
-
很可能是因为分支预测失败。见stackoverflow.com/questions/11227809/…。
-
我认为缓存是更可能的解释。访问数组时,下一个元素已经在缓存中的机会更大。
-
不知道你是如何得出数组稍微快一点的结论的。即使有一个包含 3200 万个项目的数组/树,也只需要 25 次迭代即可找到答案。我猜你测量的时间与搜索时间几乎没有关系,而与启动成本有很大关系,例如填充数组与构建树。要么是这样,要么你的树不平衡。当树不完全平衡时,访问的节点数可能大于
log(n)的理论最小值。事实上,最坏的情况可能是 O(n)。 -
向我们展示结果,数组的大小?查到了什么项目?搜索顺序?我们不能像这样帮助你。对于不同大小的数组/树,答案可能会有所不同。
-
好奇:
binary_array_search()执行if (==) else if (<) else和binary_tree_search()执行if (<) else if (>) else。如果两者都做同样的事情,这将是一个更公平的比较。
标签: c algorithm caching optimization data-structures