arrays - 如何有效地找到数组给定范围内的唯一数字?

标签 arrays algorithm unique fenwick-tree

给定一个数组(未排序)和几个范围查询。对于每个查询,我需要找到给定范围内唯一数字的数量。这是我想出的天真的方法。

#include<cstdio>
#include<iostream>
using namespace std;

int main()
{
    int n; scanf("%d",&n); //Size of the array
    int a[n+1]; a[0]=0;

    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);

    int q; scanf("%d",&q); //Number of queries

    while(q--)
    {
        int x,y; scanf("%d %d",&x,&y); //Range of each query
        int bit[n+1];
        for(int i=0;i<=n;i++)
            bit[i]=0;

        for(int i=1;i<=n;i++)
        {
            for(int j=i-1;j>0;j--)
            {
                bit[i]=a[i];
                if(bit[j]==a[i])
                {
                    bit[j]=0;
                    break;
                }
            }
        }
        int cnt=0;
        for(int i=x;i<=y;i++)
        {
            if(bit[i])
                cnt++;
        }
        printf("%d\n",cnt);
    }
    return 0;

}

执行此操作最有效的方法是什么?我认为这可以使用二进制索引树来完成,但无法提出解决方案。

最佳答案

如果范围查询的数量与数组的大小相比较小,比如 O(k) vs O(n) 其中 k << n,则:

  1. 将所有范围端点放入平衡二叉树 O(klogk)
  2. 遍历数组并计算每个子范围中的唯一元素。使用哈希表来记住我们已经看到的元素。 O(n)
  3. 在每个范围查询的范围端点之间按顺序遍历并求和子范围总数。 O(k^2) 最坏情况/O(klogk) 合理查询。

关于arrays - 如何有效地找到数组给定范围内的唯一数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27996600/

相关文章:

arrays - 使用 jq 将 JSON 对象转换为字符串数组

php explode - 需要第二个元素

python - 根据它们的交集在成对的项目中找到一条路径

javascript - 我想生成唯一 ID

python - 使用 Python 计算数据框中唯一单词的数量

list - 比较两个golang列表以检查所有元素的方法是唯一的

arrays - 如何在 swift 中实现可选择的数组结构?

c++ - 如何在 Row Major Order 中声明 3D Array?

algorithm - 集合覆盖的近似

algorithm - 来自类属性的唯一、人类可读的 ID