【问题标题】:Count distinct elements in every window of size k*k计算每个大小为 k*k 的窗口中的不同元素
【发布时间】:2018-04-20 07:54:20
【问题描述】:

我发现这个:http://www.geeksforgeeks.org/count-distinct-elements-in-every-window-of-size-k/

给定一个大小为 n 的数组和一个整数 k,返回大小为 k 的所有窗口中不同数字的计数。
(...)
一个有效的解决方案是在滑动窗口时使用前一个窗口的计数。这个想法是创建一个存储当前寡妇元素的哈希映射。当我们滑动窗口时,我们从哈希中删除一个元素并添加一个元素。我们还跟踪不同的元素。

但是对于二维数组和大小为 k*k 的窗口是否有有效的解决方案?

【问题讨论】:

  • 我编辑了这个问题,主要是为了能够撤消我的否决票(起初我认为您的问题与您链接的问题相同),但仍然有任何理由删除指向 geeksforgeeks 问题的链接及其针对 1D 案例的解决方案?我认为这使问题更加清晰。
  • 这个问题来自正在进行的竞赛 - 波兰信息学奥林匹克 - [PL] oi.edu.pl/static/attachment/20171016/rozzad.pdf。请等待您的答复,直到 14.11.2017
  • @Tacet 我想知道为什么提问者编辑了这个问题以使其成为现在的单行,以及为什么他删除了他所有的 cmets。他可能是想阻止其他人找到它。

标签: algorithm multidimensional-array sliding-window


【解决方案1】:

优化的解决方案很大程度上取决于您的价值重新分配(如果您有很多冗余或减少的可能性)。 将您之前找到的唯一数字存储在 existing_values[] 表中并检查其中已经存在的内容可能会很有趣:

对于窗口中的每个新值:

检查值是否在existing_values[]表中

  • 否:在 existing_values[] 表中添加值并增加 dist_count
  • 是的:没有

【讨论】:

  • 正如我所提到的,如果您有很多冗余,这很有趣。如果你真的想减少 k*k 窗口,你可以在窗口的每一行上应用这个过程,然后比较每行的 existing_values[] 表。至少您将只有唯一的值可供比较。
【解决方案2】:

检查二维数组中所有k×k个正方形的属性的一般方法是存储从左上角到每个单元格的所有矩形的属性,然后比较每个单元格的属性要检查的矩形的四个角。

考虑这个值从 0 到 9 的示例数组:

1 8 5 6 8  
7 2 5 4 6  
3 0 2 5 8  
9 5 1 4 6  

存储从左上角到每个单元格的矩形中每个 0-9 值的出现次数的哈希数组将是:

0100000000  0100000010  0100010010  0100011010  0100011020
0100000100  0110000110  0110020110  0110121110  0110122120
0101000100  1111000110  1121020110  1121131110  1121132130
0101000101  1111010111  1221030111  1221241111  1221243131

如果你从左上角到右下角构建这个,每个散列是它上面的散列和它左边的散列之和,减去它左上角的散列,加上单元格的值添加;例如单元格 (1,1) 的哈希值基于单元格 (1,0)、(0,1)、(0,0) 的哈希值及其自身值 2:

0100000010 + 0100000100 - 0100000000 + 0010000000 = 0110000110  

一旦你有了散列数组,你就可以使用其角落的散列来检查任何矩形,例如检查这个矩形:

. . . . .  
. 2 5 4 .  
. 0 2 5 .  
. . . . .  

您在这些位置获取哈希值:

A . . B .  
. . . . .  
C . . D .  
. . . . .  

矩形的散列是 D - B - C + A:

1121131110 - 0100011010 - 0101000100 + 0100000000 = 1020120000

表示矩形有1个0、2个2、1个4和2个5,所以有两个不同的元素:0和4。

构建哈希数组意味着计算 m×n 个哈希(其中 m×n 是数组的大小),每个哈希基于其他三个哈希,检查每个 k×k 平方意味着计算 (mk)×(nk) 个哈希,每个都基于四个哈希值。这是否意味着时间复杂度真的是 O(m×n) 可能取决于值的范围和相应的哈希大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 2021-12-20
    • 2021-10-03
    • 2015-10-31
    相关资源
    最近更新 更多