给出一个项目列表,我想把它分成四个尽可能长的组。这些项目也需要按照每个项目中的第一个字母进行分组。
26封信/4组一般涵盖每组6.5封信。如果每个组中有相同数量的项目以相同的字母开头,则可能如下所示:
[A-F] (6 letters)
[G-M] (7 letters)
[N-S] (6 letters)
[T-Z] (7 letters)然而,在实践中,我们可能会发现我们的原始列表在S组中的项目上很重。
[A-F] (50 items)
[G-M] (40 items)
[N-S] (70 items)
[T-Z] (40 items)为了达到平衡,我们可能要把以N开头的所有项目都推到第2组,把以S开头的所有项目推到第4组:
[A-F] (50 items)
[G-N] (50 items)
[O-R] (50 items)
[S-Z] (50 items)有没有人知道该在哪里给我找出解决这类问题的算法。
我很可能会在客户机上使用javascript来实现任何可行的解决方案。我想尽可能地使用一种方法的功能。
发布于 2016-08-26 16:09:08
创建4个结果列表和26个列表,通过初始字母保存临时项目,然后应用以下伪代码:
foreach item in masterlist
append item to initial letter list
increment total counter
average bucket size = total/4
iterate letter buckets in order
if current results bucket size + length letter bucket < avergae bucket size
append letter bucket to results bucket
else
append letter bucket to results bucket if it will be over average by less than it would be under if you do nothing
move to next results bucket发布于 2016-08-26 16:10:55
未获给予任何其他要求及
假设你只想粘上头几个字母
假设你会坚持几个群体,这是一个2的力量:
这解决了你提出的“提前阅读问题”。每一次剪裁都考虑到整个列表。
在这里也有很好的重用。
解决这个问题的一种实用方法是闭包。生成一个函数,该函数关闭排序列表并接受另一个将组定义为参数的列表。此信函列表将是组的开始字母和结束字母。该函数生成一个新的字母列表,使组数加倍。
你的信件列表会像这样进展:
A-Z
A-N
阿-法O-R
伪码
h = ItemRepository(sortedListOfItems).Halve;
result = h(h([A-Z]));发布于 2016-08-26 16:06:45
也许我遗漏了一些东西,但我认为这个一般的方法可能就是你想要的:
对每一组重复这一步骤。这里的主要问题是,如果说一半的单词以A开头,它不会给出你想要的结果。你需要开始看第二个字母等等。
https://softwareengineering.stackexchange.com/questions/329416
复制相似问题