Algorithm 不同颜色球在最小传递中的排序
有10000个球,可能有500种不同颜色的球 示例:有: 4-红球 5900-蓝球 3700-绿球 396-薄荷糖奶油球 或者可能有10000个红球 或者所有球都有相同的射程,即500红色、500蓝色等 我们不知道任何球的范围和颜色球的数量,但最小值是1种颜色,最大值是500种不同的颜色,我们有大小为500的辅助数组。如何将所有相同颜色的球安排在一起,以最少的传球次数和最少的换球次数?是否可以在少于两个过程中完成此操作???您需要一个过程(使用OO语法的伪代码): 其中getIndexByName返回指定给特定颜色的插槽。 如果没有为所讨论的颜色分配槽,则会分配一个新槽Algorithm 不同颜色球在最小传递中的排序,algorithm,Algorithm,有10000个球,可能有500种不同颜色的球 示例:有: 4-红球 5900-蓝球 3700-绿球 396-薄荷糖奶油球 或者可能有10000个红球 或者所有球都有相同的射程,即500红色、500蓝色等 我们不知道任何球的范围和颜色球的数量,但最小值是1种颜色,最大值是500种不同的颜色,我们有大小为500的辅助数组。如何将所有相同颜色的球安排在一起,以最少的传球次数和最少的换球次数?是否可以在少于两个过程中完成此操作???您需要一个过程(使用OO语法的伪代码): 其中getIndexByNam
假设getIndexByName的一个简单实现的复杂性是O(球的数量*颜色的数量)。首先检查所有球并计算每种颜色出现的数量,可以使用您拥有的辅助数组来完成这项工作。 然后你就知道每种颜色你必须保留多少空间。所以,当你再次检查所有的球时,你有一个指针指向它们在输出数组中应该去的位置,因为你知道你期望的每种颜色的球有多少个。处理完球后,别忘了更新颜色计数器。 通过将输入数组中的球与球应该到达的位置进行交换,可以得到
O(n)
swaps的算法
例如:
第一部分很简单,假设你有10个球,3个红色球,4个蓝色球,2个绿色球和1个黄色球
第二部分是您的输入数组:红、蓝、绿、黄
为了简单起见,我们可以按照以下顺序进行订购:
你从第一个球开始。如果它有颜色
蓝色
,我们必须在数组中的4
位置将其与球交换(因为之前的所有球都必须是红色
。我们必须将蓝色
球交换到的新位置必须在辅助数组中更新,现在应该是5
。如果我们交换的球是绿色
,我们将它与7号位置的球交换。如果球是红色
,则在sw之后ap我们可以继续下一个球。你当然可以跳过之前交换过的球。需要注意的是,使用这种技术,你最多交换两次球,然后将球交换到一个已知的位置,因此你不需要额外的传球。你可以在不到两次的传球中完成,但这会更复杂。
下面是我将如何做的-
通过#1-确定每种颜色的球数和颜色数
通过#2-每3种颜色(例1、例4、例5,分别为balls=在第10个位置放置一个标记)并使用
如果您知道最多有500种颜色,请使用或排序。我猜您在这一种之前也会问过几分钟(尽管这是一个不同的帐户)。该问题被否决并关闭,因为它没有显示自己试图解决问题。同样,此问题也没有显示尝试。如果您知道如何在两次通过(或更多)后完成此操作,则,将其包括在问题中是明智的。您能澄清一下getIndexByName
实际上是如何工作的吗?您还没有迭代过球,所以您不知道“颜色数”而且你也不知道每种颜色的球数。如果它不知道该颜色的所有球的起始位置,它如何为给定颜色分配一个位置?@SimeonVisser遇到新颜色时,可以分配第一个可用的空闲位置。@KlasLindbäck:这不会给出正确的结果。你不知道该颜色的球有多少个r有(因为你只做了一次传球),那么你怎么知道剩下的那个颜色的球有多少空位(在那之后)呢?每个位置都有一个球数(或球数)。
for (ball in balls) {
array[array.getIndexByName(ball.color)].add(ball);
}