0

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

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

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

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

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

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

PS:我正在用Java编码。

4

7 回答 7

1

是的,拥有一百万个数组大小是完全可行的。其他任何事情都只会使事情过于复杂。

于 2013-09-20T05:52:42.910 回答
1

如果要实现二叉搜索算法,可以考虑使用二叉搜索树。与数组相比,二叉树的搜索和排序效率更高。

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

于 2013-09-20T05:54:09.407 回答
1

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

参考这篇文章stackoverflowquestion

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

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

short:short 数据类型是一个 16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。与 byte 一样,适用相同的准则:在内存节省实际上很重要的情况下,您可以使用 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 文档

于 2013-09-20T05:50:59.063 回答
1

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

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

于 2013-09-20T05:58:54.750 回答
0

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

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

于 2013-09-20T05:52:57.930 回答
0

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

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

于 2013-09-20T05:50:22.503 回答
0

您可以尝试使用二叉树

于 2013-09-20T05:51:11.110 回答