【问题标题】:Design Data Structures For Somp Operation为 Somp 操作设计数据结构
【发布时间】:2014-10-15 14:53:56
【问题描述】:

我最近遇到了一个具有挑战性的问题。

假设给出了介于 1 和 SQRT(n) 之间的 n 个整数。 (可能是重复的数字,它们之间没有区别)我们想设计一个使用低内存的结构做插入/删除/搜索操作。

我们如何为所有操作和内存 SQRT(n) 设计 O(1)?

任何想法或提示都很棒!

200000!!!!谢谢

【问题讨论】:

  • 我对你的数据结构有点困惑——当你添加更多元素时,n 会增加。这是否意味着元素数量的上限也会增加?
  • 亲爱的@templatetypedef,实际上我想设计高效的数据结构,这些操作的复杂度为O(1),内存为SQRT(n)。
  • 提前知道n吗?
  • 亲爱的@templatetypedef,我们只知道给出了介于 1 和 SQRT(n) 之间的 n 个数字。
  • 我不确定我是否理解插入和删除操作 - 是否所有 n 值都是预先知道的?以后可以添加更多元素吗?以后可以删除元素吗?

标签: algorithm data-structures hash tree


【解决方案1】:

http://www.geekviewpoint.com/java/sorting/countingsort 有一篇关于计数排序的简短文章,代码如下

public void countingsort(int[] input, int k) {
    // create buckets
    int counter[] = new int[k + 1];
    // fill buckets
    for (int i : input) {
      counter[i]++;
    }
    // sort array
    int ndx = 0;
    for (int i = 0; i < counter.length; i++) {
      while (0 < counter[i]) {
        input[ndx++] = i;
        counter[i]--;
      }
    }
  }

注意这里的k 是你的SQRT(n)

您尤其希望 O(1) 删除、插入和搜索

从你简单的数字中删除一个数字 x

public boolean delete(int x){
   if (0< counter[x]){
     counter[x]--;
     return true;
  }
  return false;
}

在你做的数字中插入一个数字 x

public void insert(int x){ counter[x]++;}

搜索你做的

public boolean contains(int x){return 0< counter[x];}

您还可以使用

轻松找到特定数字的频率
public int frequency(int x){return counter[x];}

如果您需要更多帮助,请告诉我。

【讨论】:

  • 亲爱的 Labapen,我如何证明内存是 SQRT(N)?
  • 我不明白你所说的改进是什么意思。内存已经是SQRT(N),因为您的数字范围从 0 到 SQRT(N)。看看我在哪里告诉你k 等于SQRT(N)。您的数组大小为k+1,即O(sgrt(n))。所以它已经是。
【解决方案2】:

在考虑如何将 n 个自然数保留到 SQRT(n) 时,我们阅读了 counting_sort 并借用了主要思想。

【讨论】:

  • 您能在此处添加详细信息吗?并说出主要思想?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 2014-12-03
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多