Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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,数组a[]仅由1和0组成 我们希望通过交换位置来获得1的连续序列(大于或等于n) 如何在最小交换操作中执行此任务 我们可以交换任意两个位置。 此处输出从数组a[]创建大于或等于n 1的连续段所需的最小交换操作数。 数组长度从前面扫描直到得到0,然后从后面扫描直到得到1。交换它们。交换是必要的,应该清楚的是,这两个元素不需要再次交换。从当前位置重复该过程,直到参考索引在中间相遇。 所有必要的交换都将完成,每个需要交换的元素只会发生一次。我看不出你怎么能做比这更少的交换。从前面扫描,直到得到0,然后

数组a[]仅由1和0组成

我们希望通过交换位置来获得1的连续序列(大于或等于n)

如何在最小交换操作中执行此任务

我们可以交换任意两个位置。

此处输出从数组a[]创建大于或等于n 1的连续段所需的最小交换操作数。


数组长度从前面扫描直到得到0,然后从后面扫描直到得到1。交换它们。交换是必要的,应该清楚的是,这两个元素不需要再次交换。从当前位置重复该过程,直到参考索引在中间相遇。


所有必要的交换都将完成,每个需要交换的元素只会发生一次。我看不出你怎么能做比这更少的交换。

从前面扫描,直到得到0,然后从后面扫描,直到得到1。交换它们。交换是必要的,应该清楚的是,这两个元素不需要再次交换。从当前位置重复该过程,直到参考索引在中间相遇。


所有必要的交换都将完成,每个需要交换的元素只会发生一次。根据我的理解,您正在尝试将数组
a[4]={1,0,1,0}
排序为
a[4]={1,1,0},交换次数最少

可能不需要像下面这样进行任何交换

int a[4]={1,0,1,0}

for(int i=0;i<a.length;i++)
{
if(a[i] == 1 && a[i+1] != a[i+2])
{
a[i+1] = a[i+1]+a[i+2];
a[i+2] = a[i+1]-a[i+2];
a[i+1] = a[i+1]-a[i+2];
}
}
inta[4]={1,0,1,0}

对于(inti=0;i,根据我的理解,您正在尝试使用最小交换次数将数组
a[4]={1,0,1,0}
排序为
a[4]={1,1,0,0}

可能不需要像下面这样进行任何交换

int a[4]={1,0,1,0}

for(int i=0;i<a.length;i++)
{
if(a[i] == 1 && a[i+1] != a[i+2])
{
a[i+1] = a[i+1]+a[i+2];
a[i+2] = a[i+1]-a[i+2];
a[i+1] = a[i+1]-a[i+2];
}
}
inta[4]={1,0,1,0}

对于(int i=0;i取一个1和0的数组。我们希望找到以n 1s的连续序列结束所需的交换数:

1, 0, 1, 0, 1, 1
此阵列有4种可能的最终安排。所需的交换数量 对于每个排列,是原始数组中 在与最终数组中的1相同的位置:

1, 1, 1, ?, ?, ? - 1 swap
?, 1, 1, 1, ?, ? - 2 swaps
?, ?, 1, 1, 1, ? - 1 swap
?, ?, ?, 1, 1, 1 - 1 swap
这可以通过创建两个数组在线性时间内找到:一个运行总数 任何索引左侧的0数,以及索引左侧的0数 任何索引的右边。迭代所有可能的最终安排,以及 通过将这两个变量中的适当值相加,计算掉期数量
数组。

取一个1和0的数组。我们希望找到以n个1的连续序列结束所需的交换数:

1, 0, 1, 0, 1, 1
此阵列有4种可能的最终安排。所需的交换数量 对于每个排列,是原始数组中 在与最终数组中的1相同的位置:

1, 1, 1, ?, ?, ? - 1 swap
?, 1, 1, 1, ?, ? - 2 swaps
?, ?, 1, 1, 1, ? - 1 swap
?, ?, ?, 1, 1, 1 - 1 swap
这可以通过创建两个数组在线性时间内找到:一个运行总数 任何索引左侧的0数,以及索引左侧的0数 任何索引的右边。迭代所有可能的最终安排,以及 通过将这两个变量中的适当值相加,计算掉期数量
数组。

从左侧遍历数组,跟踪当前位置左侧
n
位置中1的计数

对于每个元素,如果元素
n
左侧的位置为1,则增加计数器,如果元素
n
左侧的位置为1,则减少计数器,可以很容易地做到这一点

现在,我们需要做的就是跟踪最大的上述计数-
n-这将是最小的互换数量

哦,我们可能应该检查一下数组中是否有
n
1


这将需要
O(n)
从左侧遍历数组,跟踪当前位置左侧
n
位置的1计数

对于每个元素,如果元素
n
左侧的位置为1,则增加计数器,如果元素
n
左侧的位置为1,则减少计数器,可以很容易地做到这一点

现在,我们需要做的就是跟踪最大的上述计数-
n-这将是最小的互换数量

哦,我们可能应该检查一下数组中是否有
n
1


这将需要
O(n)

所以输出应该是交换的数量?或者交换的执行说明?而不是交换。你可以加/减。就像循环数组一样->每当你找到
1
时,做一个减法
1-1
,对于
0
做加法,就像
0+1
。因为数组只包含0和1的输出应该是所需的最小交换操作数。@user2826957仅相邻交换?请记住展示您自己解决问题的尝试。因此,输出应该是交换数?或执行交换的说明?而不是交换,您可以添加/减去。就像在数组中循环->只要找到
1
执行减法
1-1
,对于
0
执行加法,如
0+1
。由于数组仅包含0和1。输出应该是所需的最小交换操作数。@用户2826957仅相邻交换?请记住展示您自己解决问题的尝试。最终位置可能不是最优的所有的1移到右边可能比移到左边更好。最终的位置可能不是最优的。将所有的1移到右边可能比移到左边更好。在这里,我们不必得到所有1的连续序列,而只需要n个连续的1。@user2826957好的,这个想法应该仍然有效。确定1的数量在最后一个数组中等于n,并在原始数组中查找1s块中的0s数