首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定索引i,j(j>=i),如何在子数组(i,j)上求出A[j]的频率?

给定索引i,j(j>=i),如何在子数组(i,j)上求出A[j]的频率?
EN

Stack Overflow用户
提问于 2014-01-14 09:35:40
回答 2查看 320关注 0票数 2

给定一个数组A的整数,我试图找出在给定的位置j,在A中的每个i=0到i=j中Aj发生了多少次,我已经设计了如下所示的解决方案

代码语言:javascript
复制
map<int,int> CF[400005];
for(int i=0;i<n;++i)
{
   cin>>A[i];
   if(i!=0)
      CF[i-1] = CF[i];
   ++CF[i][A[i]]; 
}

我无法在日志中回答每一个问题。但是这个过程占用了太多的内存。有没有办法用更少的内存做这件事?

要获得更多的澄清,您可以看到我正在试图解决的http://codeforces.com/contest/190/problem/D问题

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-14 10:22:33

创建一个与A大小相同的数组C和一个映射C。对于B[j]中的每个B[j],要跟踪A[j]j之前发生的次数。在C中,跟踪给定元素的最后一次出现。然后在恒定时间内回答查询,它只需要O(n)内存。

抱歉,我的伪C++。

代码语言:javascript
复制
map<int,int> C;
int B[n]; // zeros

for(int i=0;i<n;++i)
{
    cin >> A[i];
    int prev = C[A[i]]; // let me assume it gives -1 if no element

    if (pref == -1) // this is the fist occurrence of B[i]
        B[i] = 1;
    else // if not the first, then add previous occurrences
        B[i] = B[prev] + 1 

    C[A[i]] = i; // keep track where the last info about A[j] is
}
票数 3
EN

Stack Overflow用户

发布于 2014-01-14 10:09:20

并没有给出太多的时间,但是也许不是使用一个地图将所有的位置,而是使用一个列表,对于每个元素,您放置的点,该元素的计数变化,这样的东西:

代码语言:javascript
复制
struct count_info
{
    int index;
    int count;
    count_info* next;
};
...
std::map<int, count_info*> data;

,然后在队列中查找正确的位置。您仍然需要一个映射,但是在下面只需要一个这些指针的列表,在查询时,您可以在地图中查找Ai,然后在I> index & next && go;I&go;next->索引时遍历这个列表。当然,如果logn是必须的,那么这就失败了,因为列表查找在最坏的情况下是n。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21110075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档