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



编辑:好的,我的问题已经回答了。谢谢。最初我对使用100万的数组有疑问,因为我读到它在C中引起了一些问题,所以谢谢大家的回复!

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

我打算只坚持数字,所以二进制搜索本身应该很容易。数据将只是大量随机生成的数字(排序)到文本文件中,我计划让程序打开文件并将所有数据加载到数组中。

然而,到目前为止,我一直只是使用多达几百个数组大小。所以我的问题来了:声明一个 100 万的数组是否可行?

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

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

PS:我正在用Java编码。

是的,数组大小为 100 万是完全实用的。 其他任何事情都只是过于复杂的事情。

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

维基百科关于二叉搜索树的文章:二叉搜索树

您可以

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

参考这篇文章 堆栈溢出问题

如果排序的数字属于特定的值范围,则可以参考此表

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

short: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 提供的值范围更宽时,请使用此数据类型。

来源:java docs

对于 100 万个数字,声明数组大小为 1 百万是可以的。其他任何事情都会不必要地复杂化。

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

你应该用于大型集合的数据结构在很大程度上取决于你正在使用的数据类型,在这种情况下是一个数字(大概是int)或类似的东西。 Java 中的原始数组只是变量大小乘以数组长度的内存块,就像在 C 中一样,所以如果你使用 int s(4 字节)并且有一百万个字节,你只会为数组使用 4MB 的内存,然后你可以只使用 Arrays.sort .

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

你可以尝试使用二叉树

Java应该

可以处理100万个元素的数组。如果使用低效算法,则对该数组执行的操作可能需要很长时间,但是二分搜索应该没问题。

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

相关内容

最新更新