假设我有一个对象集合或列表{a a B a B B C C C D D E E D F F F}
随机填充列表。现在我想让它重新排列列表,如下所示
{A B C D E F A B C D E F A B C C D F}
的一种方法是为现有列表中的每个元素创建桶,然后依次遍历每个桶,选择并添加预期列表中的元素,直到所有桶最后。
可以动态地使用bucket。例如:
快速版:
当桶和输入序列不为空时:
- 获取序列X中的下一个属性值(A,B, C, D, A, .....)
- 检查输入序列中的当前位置,如果属于属性X,则将其放入新序列并增加位置,转到1
- 如果桶X不是空的,从桶X进入新的序列,移动到1
- 将物品从当前位置放入适当的桶中,增加位置,转到2
内存使用少版本
- 获取序列X中的下一个属性值(A,B, C, D, A, .....)
- 如果桶X不是空的,从桶X进入新的序列,移动到1
- 检查输入序列中的当前位置,如果属于属性X,则将其放入新序列并增加位置,转到1
- 将物品从当前位置放入适当的桶中,增加位置,转到3
假设输入仅为A-Z字母。在这种情况下,你将只有26个可能的字符。因此,只要使用哈希表来存储输入字符的计数,一旦输入存储在哈希表中。现在只需使用这个函数来获取输出。
while(hash中有任何项){
for(i 1 to 26){
打印每个非零计数字符和递减计数
}
}
将对象放入hashmap中,以其值作为键,并使用计数器表示出现次数(同时保留插入顺序)。然后创建输出列表,迭代映射中的键并附加每个键值,同时减少其计数。重复,直到地图耗尽。以下是python代码:
from collections import OrderedDict
def arrange(l):
d=OrderedDict()
for x in l:
d[x]=d.setdefault(x, 0)+1
r=[]
while len(d)>0:
for x in d:
r.append(x)
d[x]-=1
if d[x]==0:
del d[x]
return r