Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Algorithm 按出现频率的顺序打印列表唯一项_Algorithm_Sorting_Frequency_Find Occurrences - Fatal编程技术网

Algorithm 按出现频率的顺序打印列表唯一项

Algorithm 按出现频率的顺序打印列表唯一项,algorithm,sorting,frequency,find-occurrences,Algorithm,Sorting,Frequency,Find Occurrences,假设我们有一个整数数组,甚至是连续的整数流。其思想是根据出现频率按降序打印唯一元素。例如,对于7、4、2、4、9、6、5、6、2、0、2、1,我们应该得到:2、4、6、7、9、5、0、1,因为2出现了三次,4和6出现了两次,其余的只有一次 有没有比(按值对地图排序)更好、更有效的方法来计算元素的发生率,将它们存储在地图中,然后根据值对地图进行排序 然而,在我看来,应该有很多有效的算法来实现这一点,因为可能有一种方法可以动态地对频率进行排序 这个问题实际上是代数树模型中的Omega(nlogn)(

假设我们有一个整数数组,甚至是连续的整数流。其思想是根据出现频率按降序打印唯一元素。例如,对于7、4、2、4、9、6、5、6、2、0、2、1,我们应该得到:2、4、6、7、9、5、0、1,因为2出现了三次,4和6出现了两次,其余的只有一次

有没有比(
按值对地图排序
)更好、更有效的方法来计算元素的发生率,将它们存储在地图中,然后根据值对地图进行排序

然而,在我看来,应该有很多有效的算法来实现这一点,因为可能有一种方法可以动态地对频率进行排序

这个问题实际上是代数树模型中的
Omega(nlogn)
(该模型下不允许散列),从减少,因此如果您希望得到一次(或常量)迭代来解决它,而没有任何辅助数据结构来解决它-这是不可能的,因为它将允许我们在代数树模型中求解O(n)中的元素区分度

这类问题的标准解决方案是:

  • (您的建议):构建一个地图,删除重复项并按频率排序
  • 与1类似,但不是映射-对项目进行排序,使用二进制搜索查找每个元素重复的次数很容易

  • 如果您使用的是Python,那么请使用collections.Counter类及其方法


    提供的显示了在most_common()中使用的heapq,集中于可能接受输入为整数流的问题,一种解决方案是修改插入排序

    创建一个列表(此处名为
    countlist
    ),初始为空。每次接受新值时,在
    countlist
    中的每个列表中按降序进行迭代,查找值。如果在
    countlist[i]
    中找到该值,请从当前列表中删除该值,并将其插入到
    countlist[i+1]
    中,必要时向
    countlist
    添加一个新列表。如果找不到该值,请将该值插入
    countlist[1]

    迭代降序而不是升序的目的是,如果您在
    countlist[i-1]
    中找到值,它允许您维护一个指针,指向该值将插入到
    countlist[i]
    中的位置。如果不需要对共享相同计数的值进行子排序,则可以跳过此指针并进行升序迭代

    我相信这个算法总体上是O(n2)。处理每个新值是O(n),并且结果在处理过程中保持排序。在任何时候,您都可以通过在
    countlist
    中循环降序并打印每个列表来打印正确的顺序(到目前为止)

    示例运行,使用问题中的示例

    input: 7, 4, 2, 4, 9, 6, 5, 6, 2, 0, 2, 1
    
    After accepting 7:
    countlist[1] = 7
    
    After accepting 4:
    countlist[1] = 4, 7
    
    After accepting 2:
    countlist[1] = 2, 4, 7
    
    After accepting 4:
    countlist[1] = 2, 7
    countlist[2] = 4
    
    After accepting 9:
    countlist[1] = 2, 7, 9
    countlist[2] = 4
    
    After accepting 6:
    countlist[1] = 2, 6, 7, 9
    countlist[2] = 4
    
    After accepting 5:
    countlist[1] = 2, 5, 6, 7, 9
    countlist[2] = 4
    
    After accepting 6:
    countlist[1] = 2, 5, 7, 9
    countlist[2] = 4, 6
    
    After accepting 2:
    countlist[1] = 5, 7, 9
    countlist[2] = 2, 4, 6
    
    After accepting 0:
    countlist[1] = 0, 5, 7, 9
    countlist[2] = 2, 4, 6
    
    After accepting 2:
    countlist[1] = 0, 5, 7, 9
    countlist[2] = 4, 6
    countlist[3] = 2
    
    After accepting 1:
    countlist[1] = 0, 1, 5, 7, 9
    countlist[2] = 4, 6
    countlist[3] = 2
    

    什么编程语言?让我们假设它是Java,但是这比使用编程语言能力和库更能找到有效的算法,因为最终编程语言使用智能算法。显而易见的选择是如您所述的排序图,但也值得考虑使用成熟的RDBMS并使用数据库索引的功能,这取决于数据的大小,该数据也适用于流式值列表,并且您不必担心内存中的映射等内存不足问题。有趣的方法,但我相信按值对映射进行排序是可行的(nlogn),这比O(n^2)好。同意。我关注的是(问题中提到的)输入是整数流的情况。因此,我构建了算法,不需要知道我们将获得多少值,也不需要在接受每个输入后“重新排序”。
    input: 7, 4, 2, 4, 9, 6, 5, 6, 2, 0, 2, 1
    
    After accepting 7:
    countlist[1] = 7
    
    After accepting 4:
    countlist[1] = 4, 7
    
    After accepting 2:
    countlist[1] = 2, 4, 7
    
    After accepting 4:
    countlist[1] = 2, 7
    countlist[2] = 4
    
    After accepting 9:
    countlist[1] = 2, 7, 9
    countlist[2] = 4
    
    After accepting 6:
    countlist[1] = 2, 6, 7, 9
    countlist[2] = 4
    
    After accepting 5:
    countlist[1] = 2, 5, 6, 7, 9
    countlist[2] = 4
    
    After accepting 6:
    countlist[1] = 2, 5, 7, 9
    countlist[2] = 4, 6
    
    After accepting 2:
    countlist[1] = 5, 7, 9
    countlist[2] = 2, 4, 6
    
    After accepting 0:
    countlist[1] = 0, 5, 7, 9
    countlist[2] = 2, 4, 6
    
    After accepting 2:
    countlist[1] = 0, 5, 7, 9
    countlist[2] = 4, 6
    countlist[3] = 2
    
    After accepting 1:
    countlist[1] = 0, 1, 5, 7, 9
    countlist[2] = 4, 6
    countlist[3] = 2