【问题标题】:What data structure to use with arbitrarily large integer numbers? [duplicate]使用什么数据结构来处理任意大的整数? [复制]
【发布时间】:2012-07-07 22:14:47
【问题描述】:

可能重复:
What data-structure should I use to create my own “BigInteger” class?

出于纯粹的兴趣,我正在尝试设计一种可以容纳 任意大 整数的类型。我想支持四种基本操作[+, -, *, /] 并优化这些操作的速度。

我在考虑某种双向链表和一个位标志来指示正值或负值。但我不太确定如何添加,例如,添加到大量不同尺寸。我是否应该走到两个数字的最后一个元素,然后返回(使用 second 反向指针指向前一个元素)。

123456789 //一个大数 + 123 //另一个不同大小的大数

如果我可以拥有任意大的内存,那么这个任务的最佳数据结构是什么?

我将不胜感激有关算术运算的最坏情况复杂性的小提示和任何 cmet。谢谢!

【问题讨论】:

  • 你的意思是像 Java 中的 BigInteger 或 BigDecimal?
  • 如果你正在使用 c(或 c++,或者只是好奇),那么这本书 c 接口和实现会开发一个这样的库 - amazon.com/…
  • google.de/search?q=java+bigint 。第一个链接说:“不可变的任意精度整数”。
  • 我不明白为什么有人会为此使用链表
  • 澄清一下 - 您是指任意大数(没有上限的数)还是无限大数(如集合论)?

标签: algorithm data-structures big-o largenumber


【解决方案1】:

在这种情况下,通常人们会选择数组/向量,可能是 little-endian(最低有效字优先)。如果你实现就地操作,在增加数组时使用一个常数因子,那么重新分配的摊销复杂度仍然是 O(1)。

所有操作都应该在 O(n) 运行时间内可行,其中 n 是输入的大小。 编辑:不,当然,乘法和除法需要更多,this answer 说它至少是 O(N log N)。

只是出于好奇:为什么要重新实现轮子?查找here Java 中的实现。 C# 也有一个 .NET 4.0。虽然自己实现它可能是一个很好的练习(我记得自己做过一次),但如果您只需要该功能,那么它已经存在于许多计算环境中。

【讨论】:

  • @oleksii 里面基本上是一个“数字”数组(以及一些簿记信息)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
相关资源
最近更新 更多