English 中文(简体)
平均分配清单上的所有物项
原标题:Evenly distributing all items in a list

当时我一直面临这个问题,仍在努力寻求解决办法。

在清单中公平分配物品的最佳方法是什么,差异不大?

我们有一个阵列的清单或内容:

Red, Red, Red, Red, Red, Blue, Blue, Blue, Green, Green, Green, Yellow

理想的做法是,产出将产生这样的结果:

Red, Blue, Red, Green, Red, Yellow, Blue, Red, Green, Red, Blue, Green.

如果每个案件“远离”另一个案件,则可能......

当我第一次试图解决这一问题时,我必须承认我是天真的,因此,我刚刚使用某种形式的种子随机编号来掩盖名单,但这会导致 instances然。

该建议以最频繁的频率开始,因此,将对0至4个包容性强的N*12/5定位。

然后将下一个最重复的内容(Blue)放在N*12/3+1的位置上,从0到2个。 如果已经把一些东西放在那里,那么就把它放在下一个空洞的地方。 等等。 然而,在用纸上打碎纸时,这并不在所有情况下都奏效,

名单只是

Red, Red, Red, Red, Red, Blue

这将失败。

在这两种选择中,有三种同种异构体

Red, Red, Blue, Red, Red, Red
Red, Red, Red, Blue, Red, Red

因此,任何想法,或如何执行,都将是荒谬的。

如果涉及一刀切的工作,但现在我所关心的是如何做到这一点。

最佳回答

只是一个快速的想法: 每一类物品使用单独清单。 然后,将每个清单中的一个项目合并成一个新的清单,总顺序相同。 空木清单。

这当然不会产生完美的解决办法,但执行起来非常容易,而且应该迅速。 简单改进是按规模排列名单,首先是这样。 这比随机抽出名单的结果稍有改善。

Update:这或许会更好:在算法开始时获得最大清单的规模,并称之为——这套清单将在每轮处理。 现在,所有其他清单只应在<代码>上使用,从_size_of_list/LARGEST_SIZE。 我希望你们知道什么意思。 这样,你就能够公平地分配所有项目。 但是,这还不是完美的!

因此,科索沃将努力更加具体。 页: 1

第一个清单是每30/30轮使用一次,每轮1次。 这意味着每一次。 关于第二个名单,你将使用每2轮0.5份。 第三个清单:6/30->每5轮。 最后清单:3/30->每10轮。 这确实应当给你一个物品的微粒。

这当然是一个极好的例子,因为它获得的只是字节。 就数量很少的物品而言,我们获得了完美的成果。 然而,对于大量物品,它应当做大量的工作。

问题回答

你们可以产生一系列合理的数字,表明每张颜色的间隔更长。 然后,将这些数字分类。

例:

  • 5 × B: the numbers are (1/10 3/10 5/10 7/10 9/10)
  • 3 × R: the numbers are (1/6 3/6 5/6)
  • sorted: ((1/10 "B") (1/6 "R") (3/10 "B") (5/10 "B") (3/6 "R") (7/10 "B") (5/6 "R") (9/10 "B"))
  • => B R B B R B R B

当数字相等时,适用一种可以任意的二次分类,但应当前后一致。

请注意,已经对各个顺序进行了分类,因此,您可以通过合并进行分类,即:O(nlog m),在此情况下(n是所有计票的总和,m>/em>彩色数)。 可以通过 la跃编制数字进一步优化。

最后算法不需要明确分类:

  • set the B counter to (/ (* 2 5)) => 1/10
  • set the R counter to (/ (* 2 3)) => 1/6
  • set the B step to double the B counter
  • set the R step to double the R counter
  • loop
    • take one of the colour with the lowest counter and put it into your result
    • step that counter by its step width
    • until all counters are >= 1

由于你需要n 休息室步骤,每次必须找到最低m号码,这似乎在O(n)上运行。 然而,你可以将反射线保持在最低限度,使之降至O(nlog m)。

我在此附上一夫一妻在算法竞赛中为这一问题使用的解决办法。

你的奶制品最大,因此,最大煤炭的颜色将排在首位。 每当你有两起案件:如果最高点的价值与清单中最后一项内容不相等,你就把奶(COUNTERx, COLOURx)从肥皂中除去,在清单结尾处添加COL(COUNTERx)——1, COLx)到肥皂(COUNTERx)时。 - 1 ! 0. 在另一起案件中,从头胎中取出第二大二氧化碳当量,与头胎一样。 时间复杂性是 o(Slog N),N为颜色,S为名单的大小。

我认为,你需要优化某种改进功能,即计算“改进”的程度。 “蓝色”具有一定地位,而且所有可能都插入职位,然后在任何地点插入这种“gain”功能的最大值,并且继续使用。

采用动态的记分功能排出清单,对清单中每个要素而言,与价值相同的最接近部分相距。





相关问题
How to add/merge several Big O s into one

If I have an algorithm which is comprised of (let s say) three sub-algorithms, all with different O() characteristics, e.g.: algorithm A: O(n) algorithm B: O(log(n)) algorithm C: O(n log(n)) How do ...

Grokking Timsort

There s a (relatively) new sort on the block called Timsort. It s been used as Python s list.sort, and is now going to be the new Array.sort in Java 7. There s some documentation and a tiny Wikipedia ...

Manually implementing high performance algorithms in .NET

As a learning experience I recently tried implementing Quicksort with 3 way partitioning in C#. Apart from needing to add an extra range check on the left/right variables before the recursive call, ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Enumerating All Minimal Directed Cycles Of A Directed Graph

I have a directed graph and my problem is to enumerate all the minimal (cycles that cannot be constructed as the union of other cycles) directed cycles of this graph. This is different from what the ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签