【问题标题】:Efficient way to store and search number combinations存储和搜索号码组合的有效方法
【发布时间】:2016-12-14 10:45:22
【问题描述】:

我有一个应用程序,我在其中生成唯一的数字组合,例如每个组合都是唯一的。我想以一种我应该能够在以后有效地检索一些随机组合的方式存储组合。

这是一种组合的示例

35 36 37 38 39 40 50

总共有大约 4 百万种组合。

我应该如何存储数据以便以后检索组合?

【问题讨论】:

  • 你检索的依据是什么?
  • @Azodious 我只是随机检索,但我不想每次执行两次检索组合
  • 所以您在数据库中有大约 400 万个组合,并且想要检索相对少量的不同组合进行处理?
  • 你为什么不把它做成一个整数列表呢?然后为了得到一个随机组合,你生成一个介于 0 和 list_length - 1 之间的随机整数:这是你的索引。
  • @lexicore 我认为像 sqlite 这样的自包含数据库可以,但我不确定要使用什么数据类型或数据库结构应该是什么

标签: java sqlite


【解决方案1】:

由于您的组合是唯一的,而且您实际上没有针对您的号码的查询条件,因此您如何将它们存储在数据库中并不重要。只需将它们插入某个表中即可。要检索 X 个随机组合,只需执行以下操作:

SELECT * FROM table ORDER BY RANDOM() LIMIT X

见:

Select random row(s) in SQLite

关于在 SQLite 中存储整数数组:

Insert a table of integers - int[] - into SQLite database,

【讨论】:

  • 我应该将每个组合存储为 json 并以 VARCHAR 作为数据类型
  • @user2650277 这取决于您实际想要对查询中的组合做什么。如果您什么都不做,那么我会采取最简单的方法并将它们存储为逗号分隔的字符串。
【解决方案2】:

我认为可能有不同的解决方案;从某种意义上说:您真的必须存储所有这些组合吗?!

假设这些组合只是“随机的” - 你可能正在使用一些(智能)数学,一些函数 getCombinationFor(),比如

public List<Integer> getCombinationFor(long whatever)

使用固定算法为每个传入的输入创建唯一的结果。

喜欢:

getCombinationFor(0): 给出 0 1 2 3 10 20 30

getCombinationFor(1): 给出 1 2 3 4 10 20 30 40

上面当然很简单;并且根据您对这些序列的要求,您可能需要一些复杂得多的东西。但是:当然,您可以定义这样一个函数来返回一定范围内一组固定数字的排列!

重要的是:这个函数为每个输入返回一个唯一的列表;同样重要的是:给定一个特定序列,您可以立即确定用于创建该序列的数字。

因此,您无需生成包含唯一序列的大量数据,只需定义一个知道如何以确定性方式创建唯一序列的算法。如果这对你有用,它完全可以让你从存储序列中解放出来!

编辑:只记得我正在研究与这个问题/答案有点“接近”的东西......见here

【讨论】:

  • 在我的用例中,我需要生成一个范围内的数字组合......想想彩票号码。所以如果用户想要生成 100 个组合,可能会有重复
  • 嗯,这完全取决于你打算花多少“数学”。我确信可以定义一些 f(n) 来创建基于 n 的随机值列表。最后,您有一组 有限 排列。您可以构建所有这些排列!
  • 我还更新了我的答案,提供了一个指向我的一个较旧问题的链接......正是围绕该主题。还有一个人认为他必须保存 GB 的数据......直到被告知他可以使用一些智能数学并避免所有这些。
  • @user2650277 而且,如果我可能会问:如果您发现我的意见对您有所帮助,请考虑支持我关于该主题的链接问题。看到那个-1真是太痛苦了;-)
【解决方案3】:

发送数据:

使用唯一索引。在唯一违规例外情况下,只需重新随机化并发送下一条记录。

检索:

最简单的实现方法是:使用 HashSet,向其输入随机数(最大是数据库中的组合数 -1),而 hashSet.size() 小于要检索的记录数。使用 hashSet 中的数字作为 ID 或记录行数(组合)来选择数据:WHERE ID in (ids here)。

【讨论】:

  • 如果组合是唯一的,为什么还需要哈希集?
  • 组合是唯一的,但随机选择的 ID 不是。因此是 HashSet。
猜你喜欢
  • 2013-03-22
  • 2012-11-15
  • 2011-02-23
  • 2023-03-20
  • 1970-01-01
  • 2021-10-11
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多