我是否需要为此实现b-tree搜索?

时间:2010-10-24 13:36:52

标签: algorithm math search b-tree

我有一个整数数组,可能会遇到数十万(或更多),按数字上升排序,因为它们是最初堆叠的。

我需要能够查询数组,以尽可能高效地获取其第一次出现数字>=某个输入的索引。我想知道如何在不考虑它的情况下做到这一点的唯一方法就是遍历测试条件的数组直到它返回true,此时我将停止迭代。但是,这是解决这个问题的最昂贵的解决方案,我正在寻找解决它的最佳算法。

我在Objective-C中进行编码,但我将在JavaScript中举例说明,以扩大能够做出回应的人的观众。

// Sample set
var numbers = [1, 7, 23, 23, 23, 89, 1002, 1003];

var indexAfter100 = getIndexOfValueGreaterThan(100);
var indexAfter7 = getIndexOfValueGreaterThan(7);

// (indexAfter100 == 6) == true
// (indexAfter7 == 2) == true

将这些数据放入数据库以执行此搜索只是最后的解决方案,因为我很想看到某种算法在内存中快速解决这个问题。

能够更改数据结构,或者在我构建数组时存储其他数据结构,因为我的程序已经将每个数字逐个推入此堆栈,所以我只修改将它们添加到堆栈的代码。在索引被添加到堆栈时搜索索引是不可能的,因为搜索操作将在事后经常以不同的值重复。

现在我正在考虑“B-Tree”但是说实话,我不知道如何实现一个,在我开始计算之前,我想知道是否有一个很好的算法适合这个单一的用例更好?

5 个答案:

答案 0 :(得分:7)

您应该使用binary search。 Objective C甚至可以有一个内置的方法(我知道很多语言)。除非你想将数据存储在磁盘上,否则B树的帮助可能不大。

答案 1 :(得分:2)

我不知道Objective-C,但C(普通'ol C)附带了一个名为bsearch的函数(此外,AFAIK,Obj-C可以很好地调用C函数):

http://www.cplusplus.com/reference/clibrary/cstdlib/bsearch/

这基本上是一个二元搜索,听起来就像你需要的那样。

答案 2 :(得分:1)

快速搜索算法应该能够处理这个大小的整数数组而不需要太长时间,我应该想(并且数组已经排序,因此二进制搜索可能是最好的方法)。

我认为btree可能有点过分......

答案 3 :(得分:0)

由于它们按特定的ASCending顺序排序而你只需要更大的顺序,我会序列化该数组,通过INT对其进行爆炸并保留包含较大INT的序列化字符串的一部分,然后将其反序列化并转换为voilá

答案 4 :(得分:0)

线性搜索也称为顺序搜索,从头开始依次查看每个元素,以查看数据结构中是否存在所需元素。当数据量很小时,这种搜索很快。它很容易,但是所需的工作量与要搜索的数据量成正比。如果不存在所需的元素,加倍元素的数量将使搜索时间加倍。 / p>

二进制搜索对于更大的数组是有效的。在这里我们检查中间元素。如果值大于我们正在寻找的值,那么查看上半部分;否则,查看下半部分。重复此操作,直到找到所需的项目。必须对表进行排序以进行二进制搜索。它在每次迭代时消除了一半数据。它是对数