【问题标题】:algorithm to spread linear range of integral numbers to bigger array将整数的线性范围扩展到更大数组的算法
【发布时间】:2020-10-08 21:12:35
【问题描述】:

问题

  1. 例如有整数。 i = ,代表 49 个数字 (102,103,...150)
  2. 有一个空数组 a[60],所以大小为 60 个空闲“槽”
  3. 需要一个算法,如何将 49 个数字尽可能均匀地分布到 60 个插槽的数组中,很明显有些数字必须重复才能填满所有 60 个插槽,正好是 12 个
  4. 没有空闲内存可以预先计数(a[] 也可以是 10000 的大小),算法必须像流一样工作,因此它将返回特定索引 a[0]、a[1 的数字], a[2],... 当它要求时。
  5. 它必须很快,因为消费者有一个时间段来获取值

示例

在以下示例中,所有内容都对齐得很漂亮

    i = <10, 14> => 5 numbers  
    a[10]  => 10 slots

预期结果

    a[0] = 10  
    a[1] = 10  
    a[2] = 11  
    a[3] = 11  
    a[4] = 12  
    a[5] = 12  
    a[6] = 13  
    a[7] = 13  
    a[8] = 14  
    a[9] = 14

希望我已经清楚地描述了它以理解:-),

我已经做了一些实现,但它并没有像我希望的那样均匀分布

感谢所有答案或至少指出正确的方向

【问题讨论】:

  • 类似line drawing algorithm 的东西应该可以工作,其中xa[] 中的项目数,y 是该范围内的值数。
  • 顺便说一句,在 102 到 150 之间有 49 个数字。这对于这个问题并不重要,但重要的是如果您的代码有同样的错误。
  • 谢谢,你是对的,但是我现在不能编辑,因为需要通过堆栈溢出合并帐户
  • 感谢您对算法的建议。我要看看它是否适合

标签: algorithm numbers spread


【解决方案1】:

研究如何将二叉树存储为数组。

基本上,当您流式传输数字时,您会构建二进制数组,在任何时候您都可以扩展二叉树 只需将父值复制到它的孩子(如果孩子没有价值)。

棘手的一点可能是确保您知道什么是“复制值”以及什么是实际值。

这里的想法是尽可能避免扩展,因为这会使其他一切都花费更长的时间。

您可以让a[0], a[1], a[2] 随心所欲地工作,方法是将数组包装在一个实用程序中,该实用程序根据请求的索引计算元素的位置。即:a[45] = a.at_index(45)。或者,您可能意味着您实际上想要a.next() 之类的东西(第一次调用给a[0] 第二次调用给a[1] 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2017-09-17
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多