【问题标题】:algorithm to convert large numbers to small in java [closed]在java中将大数转换为小数的算法[关闭]
【发布时间】:2013-09-20 07:21:18
【问题描述】:

我有一组从 1 到 100 000 000 000 的数字。但总数不超过 50 000。 似乎可以创建具有 50 000 个元素的对象数组。所以我可以通过索引从数组中获取元素,这非常快 - 如果我拥有从 1 到 50 000 的所有这些数字。 是否可以使用一些函数来映射从 1 到 50 000 的数字?在这种情况下,要找到对象,我只计算索引!

【问题讨论】:

  • 使用模块化算法。这样,您可以将 1 到 100 000 000 000 之间的每个数字映射到 1 到 50 000 之间的数字。
  • 如果您将 50,000 个数字按排序顺序添加到数组中,您可以使用二进制搜索来查找给定数字是否在大约 16 步中的数组中。你问的是这个吗?
  • @Jakob:我怀疑 OP 正在寻找一对一的映射...
  • @Jakob 加上类似线性探测的东西,否则你会遇到太多的碰撞。

标签: java arrays algorithm indexing


【解决方案1】:

您所描述的是hashmap。它使用对,其中第一个值是它所引用的“键”,第二个是实际存储的“值”。

//49,999 is the initial size and .8F (80%) is the load factor
//Sizes that are prime numbers are usually more efficient
HashMap<Integer, Long> hashMap = new HashMap<>(49999, .8F);

//Save first value of 1,000,000,00
Integer intKey = 1;
Long lngValue = 1000000000;
hashMap.put(intKey, lngValue);

//Retrieve first value
lngValue = hashMap.get(intKey);

//Retrieve a list of all the Keys saved in the map
Integer[] intKeys = (Integer[])hashMap.keySet().toArray();

//Retrieve a list of all the saved Values
Long[] lngValues = (Long[])hashMap.values().toArray();

通常,您希望负载率在 70% 到 80% 左右,以便有足够的空间让它高效工作。较高的负载因子会减少内存浪费,但会降低内存开始填满时的性能。

YouTube 上的 Derek Banas 有一些很棒的教程,介绍了哈希函数的工作原理以及如何使用它们。如果您对它们还不太熟悉,它们绝对值得一试。

Java Hash Table

对于您需要的,Sparse Array 是另一种可能更有效的选项。我对它们不太熟悉,但据我了解,它类似于链表。 Android 有一个您可能能够实现的实现,并且宝藏集合也是 suggested in another question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2013-11-28
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多