Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 不同颜色球在最小传递中的排序_Algorithm - Fatal编程技术网

Algorithm 不同颜色球在最小传递中的排序

Algorithm 不同颜色球在最小传递中的排序,algorithm,Algorithm,有10000个球,可能有500种不同颜色的球 示例:有: 4-红球 5900-蓝球 3700-绿球 396-薄荷糖奶油球 或者可能有10000个红球 或者所有球都有相同的射程,即500红色、500蓝色等 我们不知道任何球的范围和颜色球的数量,但最小值是1种颜色,最大值是500种不同的颜色,我们有大小为500的辅助数组。如何将所有相同颜色的球安排在一起,以最少的传球次数和最少的换球次数?是否可以在少于两个过程中完成此操作???您需要一个过程(使用OO语法的伪代码): 其中getIndexByNam

有10000个球,可能有500种不同颜色的球

示例:有:

4-红球

5900-蓝球

3700-绿球

396-薄荷糖奶油球

或者可能有10000个红球

或者所有球都有相同的射程,即500红色、500蓝色等

我们不知道任何球的范围和颜色球的数量,但最小值是1种颜色,最大值是500种不同的颜色,我们有大小为500的辅助数组。如何将所有相同颜色的球安排在一起,以最少的传球次数和最少的换球次数?是否可以在少于两个过程中完成此操作???

您需要一个过程(使用OO语法的伪代码):

其中getIndexByName返回指定给特定颜色的插槽。 如果没有为所讨论的颜色分配槽,则会分配一个新槽


假设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);
}