Algorithm 什么';将同一字符串分组的最佳算法是什么?

Algorithm 什么';将同一字符串分组的最佳算法是什么?,algorithm,Algorithm,每一种排序算法都将是一项工作,但这是一项过火的工作 对于输入,例如: aa cc aa bb dd bb cc 我只需要像这样的东西: aa aa cc cc bb bb dd 不需要每个图案的顺序 这种工作有这样的算法吗?好吧,在我的脑海里,你可以运行一个过程,计算每个元素存在的数量,然后创建一个新数组,并按顺序发布它们。这可能是O(n),但不是“到位” 因此: 让我们尝试一个例子: 我们有一个原始输入aa bb aa cc cc dd cc 我们将制作计数器设备,并扫描输入aa,读取第一

每一种排序算法都将是一项工作,但这是一项过火的工作

对于输入,例如:

aa
cc
aa
bb
dd
bb
cc
我只需要像这样的东西:

aa
aa
cc
cc
bb
bb
dd
不需要每个图案的顺序


这种工作有这样的算法吗?

好吧,在我的脑海里,你可以运行一个过程,计算每个元素存在的数量,然后创建一个新数组,并按顺序发布它们。这可能是O(n),但不是“到位”

因此:

让我们尝试一个例子:

我们有一个原始输入
aa bb aa cc cc dd cc

我们将制作计数器设备,并扫描输入
aa
,读取第一个元素,因为我们以前从未遇到过
aa
,我们将把它添加到计数器设备中

计数器设备:
[(aa,1)]

现在让我们继续阅读下一个输入,
bb
。也找不到它,并添加了:

计数器设备:
[(aa,1)、(bb,1)]

再次执行步骤,并将
aa
作为第三个元素读取。这是在我们的设备中发现的,因此我们没有再次添加它,而是将与
aa
相关的计数器增加1

计数器设备:
[(aa,2)、(bb,1)]

我将继续并为您提供结束计数器设备状态:

[(aa,2)、(bb,1)、(cc,3)、(dd,1)]

现在我们通过这个设备,将每个元素的编号打印出很多次,每个元素的名称都相同。(如果顺序很重要,这是一个实现细节,它将决定是使用关联的集合字典,还是使用某种存储顺序的双工数组设备。这是特定于语言的,但我相信您可以解决。如果您不能解决,请在此处进行注释,我将描述一个解决方案。)

打印aa aa bb cc cc cc dd

您只需要在此处使用a,或者更抽象地使用a。迭代输入,将其添加到哈希表中,如果尚未看到,则使用值(标记,如果愿意)为1;如果哈希表中已经存在,则将计数增加1


因此,该算法在时间和空间上都是O(n),这与您合理预期的一样好。我建议大家阅读一下哈希表,因为它是一种非常有用的数据结构,在算法和软件设计中随处可见。

创建一个关键字为单词和计数值的字典就足够了吗?你可以通过你的列表,添加一个计数为1的键(如果它不在那里),然后更新键(否则)。比我的更详细,实现级别更高——我同意+1@BlackVegetable:啊,谢谢。当你发布时,我没有看到你的,但我们似乎只是用不同的方式解释了相同的解决方案。:)+1无论如何。
// Make outputArrayCounter
// While inputArray has elements left:
//   if current element is new, add to outputArrayCounter
//   if current element has been seen before, increment a counter associated with that 
//   element.
// Part 2...
// Make outputArray
// create the appropriate number of elements as found in the outputArrayCounter for
// every different element type.