Java 我应该使用什么样的数据结构来创建我自己的";“大整数”;上课?

Java 我应该使用什么样的数据结构来创建我自己的";“大整数”;上课?,java,c++,data-structures,biginteger,Java,C++,Data Structures,Biginteger,作为一项可选任务,我正在考虑编写我自己的BigInteger类实现,在这里我将提供我自己的加法、减法、乘法等方法 这将适用于任意长的整数,甚至是数百位数 在对这些数字进行计算时,逐位计算并不困难,您认为最好的数据结构是什么来表示我的“BigInteger” 起初我考虑使用一个数组,但后来我想在一次大的加法或乘法运算后,我仍然可能会溢出(数组插槽用完)。这是一个使用链表的好例子吗,因为我可以用O(1)时间复杂度加上数字 是否有比链表更适合的其他数据结构?我的数据结构保存的类型是否应该是我可用的最小

作为一项可选任务,我正在考虑编写我自己的BigInteger类实现,在这里我将提供我自己的加法、减法、乘法等方法

这将适用于任意长的整数,甚至是数百位数

在对这些数字进行计算时,逐位计算并不困难,您认为最好的数据结构是什么来表示我的“BigInteger”

起初我考虑使用一个数组,但后来我想在一次大的加法或乘法运算后,我仍然可能会溢出(数组插槽用完)。这是一个使用链表的好例子吗,因为我可以用O(1)时间复杂度加上数字

是否有比链表更适合的其他数据结构?我的数据结构保存的类型是否应该是我可用的最小整数类型


另外,我应该注意如何存储“carry”变量吗?它本身是否属于我的“BigInteger”类型?

我会说是一个整数数组。

我会说是一个字符的std::vector(因为它只能容纳0-9)(如果你打算在BCD中工作)

如果不是BCD,则使用int向量(您没有明确说明)

大大减少了链接列表的空间开销


所有的建议都是“除非你有充分的理由,否则不要使用向量”

数组确实是一种自然的匹配。我认为当您的内存中的位置用完时,抛出OverflowException是可以接受的。老师会注意细节

乘法大约是数字的两倍,加法最多增加1。创建足够大的数组来存储操作结果很容易


进位在乘法中最多是一位数(9*9=1,进位8)。一个int就可以了。

始终使用最小的int类型来完成所需的工作(字节)。链表应该很好用,因为你不必担心溢出。

看看大卫·R·汉森的书。它有两章介绍这个主题,包括向量结构、字数和你可能遇到的许多其他问题

是为C编写的,但大多数都适用于C++和/或java。如果你使用C++,它会更简单一些,因为你可以用诸如“代码> STD::vector < /Cord>”来管理数组的分配。

< P>如果使用二进制树(其叶为int),则可以用更简单的分治算法获得链表的所有优点(无界数等)。在这种情况下,你没有一个基地,但许多基地取决于你的工作水平

如果这样做,则需要使用BigInteger进行进位。你可以认为它是“INTs链表”方法的一个优点,即进位总是可以表示为int(这对于任何一个基来说都是正确的,而不仅仅是对于基10,因为大多数答案似乎假设你应该使用……在任何一个基中,进位总是一个位数)


我不妨这样说:当你可以使用2^30或2^31时,使用base 10将是一种可怕的浪费。

访问链表元素的速度很慢。我认为数组是一种选择,需要进行大量绑定检查,并根据需要调整运行时数组的大小



澄清:遍历链表和数组都是O(n)操作。但是遍历链表需要在每一步延迟一个指针。仅仅因为两个算法都具有相同的复杂性,并不意味着它们都需要相同的运行时间。在链表中分配和取消分配n个节点的开销也比单个大小为n的数组的内存管理要大得多,即使该数组需要调整几次大小。

std::vector
std::vector
可能就是您想要的。由于需要更多的空间进行乘法等操作,因此必须对它们进行
向后推()
调整大小()
。此外,如果使用两个补语,请记住向后推正确的符号位。

根据经验,使用
std::vector
而不是
std::list
,除非你需要经常在序列中间插入元素。向量往往更快,因为它们是连续存储的,因此受益于更好的空间位置(现代平台上的一个主要性能因素)

确保使用适合平台的自然元素。如果希望独立于平台,请使用
long
。请记住,除非您有一些特殊的编译器内部函数可用,否则您将需要至少两倍大的类型来执行乘法

我不明白你为什么想把进位变成一个大整数。进位是用于加法的单个位,元素大小是用于乘法的


请务必阅读Knuth的《计算机编程艺术》,其中对与任意精度算法相关的算法进行了大量描述。

哇,这里有一些……有趣的答案。我建议你读一本书,而不是把这些自相矛盾的建议整理一下

也就是说,C/C++也不适合这个任务。大整数是一种扩展精度数学。大多数CPU提供指令以与普通数学相当或相同的速度(每条指令的位数)处理扩展精度数学。当您添加2^32+2^32时,答案是0…但是处理器的ALU还有一个特殊的进位输出,程序可以读取和使用它

C++无法访问该标志,在C中也没有办法。你必须使用汇编程序


为了满足好奇心,您可以使用标准布尔算法来恢复进位等。但下载现有库会更好。

您至少可以解决我提到的有关实现的问题吗?它们有多慢?我没有对这些操作进行随机访问,只是按顺序进行。这个wo