Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary search 线性搜索和二进制搜索之间的权衡_Binary Search_Linear Search_Tradeoff - Fatal编程技术网

Binary search 线性搜索和二进制搜索之间的权衡

Binary search 线性搜索和二进制搜索之间的权衡,binary-search,linear-search,tradeoff,Binary Search,Linear Search,Tradeoff,我有一个要在可变长度的数据集中搜索的元素列表。我尝试过二进制搜索,发现当目标是搜索元素列表时,它并不总是有效的 我做了以下研究,得出结论,如果要搜索的元素数量少于数据的5%,则二进制搜索是有效的,而线性搜索则更好 以下是详细信息 元素数:100000 要搜索的元素数:5000 迭代次数(二进制搜索)= log2(N)x SearchCount=log2(100000)x 5000=83048 搜索元素数量的进一步增加会导致比线性搜索更多的迭代 有什么想法吗 仅当要搜索的元素数小于5%时,我才调用

我有一个要在可变长度的数据集中搜索的元素列表。我尝试过二进制搜索,发现当目标是搜索元素列表时,它并不总是有效的

我做了以下研究,得出结论,如果要搜索的元素数量少于数据的5%,则二进制搜索是有效的,而线性搜索则更好

以下是详细信息
元素数:100000
要搜索的元素数:5000
迭代次数(二进制搜索)=
log2(N)x SearchCount=log2(100000)x 5000=83048

搜索元素数量的进一步增加会导致比线性搜索更多的迭代

有什么想法吗

仅当要搜索的元素数小于5%时,我才调用下面的函数

       private int SearchIndex(ref List<long> entitylist, ref long[] DataList, int i, int len, ref int listcount)
    {
            int Start = i;
            int End = len-1;
            int mid;

            while (Start <= End)
            {
                mid = (Start + End) / 2;


                long target = DataList[mid];

                if (target == entitylist[listcount])
                {
                    i = mid;
                    listcount++;
                    return i;
                }
                else
                {
                    if (target < entitylist[listcount])
                    {
                        Start = mid + 1;
                    }

                    if (target > entitylist[listcount])
                    {
                        End = mid - 1;
                    }
                }
            }
            listcount++;
            return -1; //if the element in the list is not in the dataset


    }
private int SearchIndex(ref List entitylist,ref long[]DataList,int i,int len,ref int listcount)
{
int Start=i;
int-End=len-1;
int mid;
while(启动entitylist[listcount])
{
结束=中间-1;
}
}
}
listcount++;
返回-1//如果列表中的元素不在数据集中
}

在代码中,我重新运行索引而不是值,因为我需要在调用函数中使用索引。如果i=-1,调用函数将该值重置为前一个i,并使用新元素再次调用该函数进行搜索。

在您的问题中,您在N长数组中查找M个值,N>M,但M可能相当大

通常,这可以作为M个独立的二进制搜索来实现(甚至可以使用前面的结果作为起点进行轻微优化):您将进入O(M*log(N))

但是,使用M值也被排序的事实,您可以通过线性搜索在一次过程中找到所有值。在这种情况下,你的问题是O(N)。事实上,对于M大,这比O(M*log(N))好

但您还有第三种选择:因为M个值是排序的,所以也可以对M进行二进制分割,每次找到它时,您都可以将后续搜索限制在找到的索引的左侧和右侧的范围内

第一次查找的是所有N个值,第二次查找的是(平均)N/2,而不是N/4数据上的4,。。。。我认为这个尺度是O(log(M)*log(N))。不确定,欢迎评论

然而,我已经稍微修改了你的代码,但没有改变它的功能

如果M=100000,N=1000000,“M二进制搜索方法”需要大约180万次迭代,这比线性扫描N个值所需的100万次迭代还要多。但根据我的建议,只需要272K次迭代


即使M值非常“折叠”(例如,它们是连续的),并且线性搜索处于最佳状态(100K次迭代足以获得所有这些值,请参见代码中的注释),该算法的性能也非常好。

问题是什么?log2(100000)=83048?您的意思是对要搜索的元素列表进行排序,您可以通过已排序的数据集优化搜索。这可以通过线性搜索轻松实现。但是,如果从要搜索的元素的排序列表开始,则可以将二进制搜索限制为数据集的子集。发布一些工作代码,如果不够清晰,我将演示如何使用。@HRK44这是一个好地方。我更新了描述。您正在修改线性搜索以适应问题,但使用的是二进制搜索的原始版本。似乎有点不公平:'(您的解决方案看起来很有趣,大约比大型搜索列表的线性搜索快4倍。我将进一步检查它,并在这方面进行恢复。感谢您的努力。