【问题标题】:Finding an input number to know where it should lie in the array查找输入数字以知道它应该在数组中的位置
【发布时间】:2012-11-01 13:33:14
【问题描述】:


我有一个小算法问题。例如,我有一个数组。

array[10] = {23,54,10,63,52,36,41,7,20,22};

现在给定一个输入数字,例如 189,我想知道它应该位于哪个插槽中。 例如,这个输入应该位于数组中的 4 个索引中,因为

23+54+10+63 = 150 and if we add 52 then sum will be 202 which will cover the range where 189 should lie. so the answer should be 4. 


我想找到一个摊销的恒定时间算法,可能在第一步我们对数组进行一些预处理,以便我们可以在恒定时间内获得所有下一个查询。

输入的数字将始终介于 1 和数组中所有条目的总和之间
谢谢

【问题讨论】:

  • 您不会获得用于槽计算或项目插入的摊销恒定时间。据我所知。您希望能够做到吗?

标签: c++ arrays algorithm search


【解决方案1】:

如果您确实需要恒定时间,请创建第二个数组,该数组的大小是包含原始数组索引的最大总和值。所以 new_array[189] = 4;

【讨论】:

    【解决方案2】:

    自然的解决方案是首先使用累积和构建一个数组。这看起来像

    sums[10] = {23,77,87,...}
    

    然后使用诸如lower_bound算法之类的二分查找来查找插入的位置。那将是O(log(n))。假设您的插槽数是恒定的,则此解决方案也是时间恒定的。但我猜您希望就插槽数而言查找为O(1)。在这种情况下,您必须制作一个完整的查找表。由于这些数字的大小相对较小,这是完全可行的:

    int lookup[N];
    for(i=0,j=0;i<10;i++)
        for(k=0;k<sums[i];k++,j++)
            lookup[j]=i;
    

    使用这个,槽号就是lookup[number]

    【讨论】:

    • 对此稍作修改,您可以改为拥有一个包含与数组中所有值的总和相同数量的元素的数组(在本例中为 328)。数组中每个项目的值对应于数组槽...例如,lookup[189]lookup[200] 的值都为4。这将受到数组中值总和的严重限制,但是......但对于 OP 的示例,它可以很容易地作为 O(1) 查找。
    • @Rook:我认为这正是我在这里所做的。
    • 嗯。我可以发誓,当我输入回复时,您的答案的第二部分不存在......就像O(log(b)) 声明一样。可能我要疯了。
    • 我认为大多数人对 O(logn) 时间算法的看法是正确的。对于恒定的时间,我需要更多的内存。
    【解决方案3】:

    我认为你能得到的最好的方法是使用累积数组并通过使用二进制搜索以对数时间运行。我不确定是否存在具有恒定时间的解决方案。你确定有吗?

    【讨论】:

    • 我不确定是否存在。但我真的很感兴趣,如果有这就是向社区成员询问的原因。
    • 我认为它不存在。因为您将拥有一个带有“孔”的值数组,并且您需要在此数组中搜索以找到您的位置。而且这个搜索不能在 O(1) 内完成
    【解决方案4】:

    如果你知道数字总是介于 1 和数组中所有项的总和之间,那么平凡的常数时间算法是构建一个 [1..sum] 的数组,每个条目包含每个条目的正确槽数字。构建数组,你只需要做一次,是 O(N)。然后查找是 O(1)。

    当然,这假设您有足够的内存用于数组。

    除此之外,我认为您能做的最好的事情是对总和使用二进制搜索 O(log(N))。

    【讨论】:

      【解决方案5】:

      假设

      输入的数字将始终介于 1 和所有数字的总和之间 数组中的条目

      int total(0), i(0);
      for(;total < inputValue; ++i)
      {
          total += array[i];
      }
      //your answer is i-1
      

      【讨论】:

      • 虽然有效,但运行时间取决于数量。他正在寻找一种更有效的算法。
      • @jim 我突然想到要在最后添加“int answer(i);for(;i
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多