Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 固定宽度范围内的最频繁元素-线性时间 问题是:_Performance_Algorithm_Language Agnostic - Fatal编程技术网

Performance 固定宽度范围内的最频繁元素-线性时间 问题是:

Performance 固定宽度范围内的最频繁元素-线性时间 问题是:,performance,algorithm,language-agnostic,Performance,Algorithm,Language Agnostic,我有一个由N个整数组成的数组。对于每个i(i常数时间。N为5*10^6时间日志(10000)仅为65*10^6,这是非常快的,CPU速度通常为每秒10^8次操作(用于编程竞赛),但我将有多达M个列表,如何处理空列表?

我有一个由N个整数组成的数组。对于每个i(i

每个元素A[i]都在0到10000之间。

但是N您可以使用专门的堆获得线性时间。这个堆不过是链表的(M+1)元素数组。索引k处的链表由在当前窗口中出现k次的元素组成。若要增加元素的计数,请将其从当前列表中删除,并将其插入到较高的列表中。检查此元素现在是否最频繁。要减少元素的计数,请将其从当前列表中删除,并将其插入较低的列表中。通过检查该元素以前的列表,检查该元素是否不再是最频繁的元素

在C语言中,所需的结构可以这样声明

struct Node {
    struct Node *prev, *next;
    long freq;
    int value;
} g_element[10000 + 1];

struct Node g_list_head[500000 + 1];

struct Node *g_most_freq;

O(N log 10000)是每个请求的,对吗?或者是预处理时间(以及每个请求需要多长时间)?顺便说一句,这类事情通常的想法是做预处理,然后每个请求比O(N)快得多(因为这可能太慢了)。我不清楚范围是否重叠。你期望有多少产出?e、 g.如果N=100,M=4,你会期望25个输出还是大约100个输出?@Dukeling我必须为数组的每个范围I,I+M预计算最频繁的元素。你的二进制堆解决方案可以非常快速,因为当移动到下一个范围时,你必须修改两个值,一个必须增加一个,一个必须减少一个。增加和减少的结果是将该元素在堆中上下移动通常不超过一级->常数时间。N为5*10^6时间日志(10000)仅为65*10^6,这是非常快的,CPU速度通常为每秒10^8次操作(用于编程竞赛),但我将有多达M个列表,如何处理空列表?