如果我必须对大量数据实施二进制搜索,我应该使用哪种数据类型?

时间:2013-09-20 05:46:36

标签: java arrays binary-search large-data

编辑:好的,我的问题已得到解答。谢谢。最初我怀疑使用100万的数据因为我读了它导致了C中的一些问题,所以感谢大家的回复!

好的,大家好,我有一个学校作业,我必须编码二进制搜索,以搜索一组数据中的一段数据,这些数据可能达到100万。

我打算坚持使用数字,因此二进制搜索本身应该非常简单。数据将只是大量随机生成的数字(已排序)到文本文件中,我计划让程序打开文件并将所有数据加载到数组中。

但到目前为止,我一直在使用高达数百的数组。 所以这是我的问题:声明一个100万的数组是否可行?

如果阵列大小为100万是不切实际的,那么你们会建议什么?我是否必须将数据拆分为多个文件,并且具有较小的数组大小,例如10,000?或者除了我可以使用的数组之外还有其他数据类型吗?

非常感谢任何有用的回复,谢谢!

PS:我用Java编码。

7 个答案:

答案 0 :(得分:1)

您可以设置的数组的最大大小为Integer.MAX_VALUE - 5。内存地址索引是32位,并且有一个对象头+长度,所以它们仍然需要通过该32位索引进行寻址

参考这篇文章stackoverflowquestion

如果您排序的数字落在特定值范围内,那么您可以参考此表

byte:字节数据类型是8位有符号二进制补码整数。它的最小值为-128,最大值为127(含)。字节数据类型可用于在大型阵列中保存内存,其中节省的内存实际上很重要。它们也可用于代替int,其限制有助于澄清您的代码;变量范围有限的事实可以作为一种文档形式。

short:短数据类型是16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(含)。与字节一样,相同的准则也适用:在内存节省实际上很重要的情况下,您可以使用short来节省大型阵列中的内存。

int:int数据类型是32位带符号的二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647(含)。对于整数值,此数据类型通常是默认选择,除非有理由(如上所述)选择其他内容。此数据类型很可能足以容纳您的程序将使用的数字,但如果您需要更宽范围的值,请使用long。

long:long数据类型是64位带符号的二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(含)。当需要比int提供的值范围更宽的值时,请使用此数据类型。

Src: java docs

答案 1 :(得分:1)

是的,数组大小为100万是完全可行的。其他任何事情都让事情变得过于复杂。

答案 2 :(得分:1)

如果要实现二进制搜索算法,可以考虑使用二叉搜索树。二叉树可以比数组更有效地进行搜索和排序。

关于二元搜索树的维基百科文章:Binary Search Trees

答案 3 :(得分:1)

对于宣布阵列大小为100万的100万个数字来说很好。其他任何事情都会造成不必要的复杂化。

如果你有非常庞大的数据,那么你可以去分割数据,而不是排序和二进制搜索。但是100万看起来过于复杂。

答案 4 :(得分:0)

您应该用于大型设置的数据结构非常依赖于您正在使用的数据类型,在这种情况下是一个数字(大概是{{ 1}})或其他一些。 Java中的原始数组只是变量大小的内存块乘以数组的长度,就像在C中一样,所以如果你使用int s(4个字节)并且有一百万个,那么你只会为阵列使用4MB内存,然后你就可以使用int

类似情况的答案是,您要对对象而不是基元进行排序,这取决于许多变量,例如对象的大小以及它们是否将存在于数据库,平面文件等中。 / p>

答案 5 :(得分:0)

您可以尝试使用二叉树

答案 6 :(得分:0)

Java应该没有100万个元素的数组。如果你使用效率低下的算法,你在该阵列上执行的操作可能需要很长时间,但二进制搜索应该没问题。

一旦将第一个重复项插入到二进制搜索树中,任何重复项都可能被忽略,并且由于您只是处理数字(int或long),因此数组应该没问题。此外,只需一点点数学运算,您就可以直接对数组中的元素执行任何二进制树操作,只需很少的临时变量来交换条目,并维护数组中使用的元素总数(因为可能没有填写所有100万个条目)。