Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Arrays 无冲突随机填充数组的算法_Arrays_Algorithm_Fill_Random Access - Fatal编程技术网

Arrays 无冲突随机填充数组的算法

Arrays 无冲突随机填充数组的算法,arrays,algorithm,fill,random-access,Arrays,Algorithm,Fill,Random Access,假设将一个由N个整数组成的数组设置为值“0”,我想从该数组中选取一个值为“0”的随机元素,并将其设置为值“1” 我如何有效地做到这一点 我想出了两个解决方案,但它们看起来很无效 第一种解决方案 int array[N] //init to 0s int n //number of 1s we want to add to the array int i = 0 while i < n int a = random(0, N) if array[a] == 0

假设将一个由N个整数组成的数组设置为值“0”,我想从该数组中选取一个值为“0”的随机元素,并将其设置为值“1”

我如何有效地做到这一点

我想出了两个解决方案,但它们看起来很无效

第一种解决方案

int array[N] //init to 0s
int n //number of 1s we want to add to the array
int i = 0
while i < n
    int a = random(0, N)
    if array[a] == 0
        array[a] = 1
        i++
    end if
end while
由于可能发生碰撞,因此对于大型阵列来说效率极低

第二个涉及一个包含所有剩余0个位置的列表,我们在0和剩余0之间选择一个随机数来查找列表中与数组中的索引相对应的值。 它比第一种解决方案可靠得多,因为操作数是有界的,但最坏情况下的复杂度仍然是N²如果我们想完全填充数组,可以用N个1和N-N个0填充数组,并进行随机洗牌

具有线性复杂性:

for i from N−1 downto 1 do
     j ← random integer such that 0 ≤ j ≤ i
     exchange a[j] and a[i]
您可以用n个1和n-n个0填充数组并进行随机洗牌

具有线性复杂性:

for i from N−1 downto 1 do
     j ← random integer such that 0 ≤ j ≤ i
     exchange a[j] and a[i]

您的第二个解决方案实际上是一个良好的开端。我假设它涉及到在每次更改后重新生成位置列表,如果您想填充整个数组,这将使其处于打开状态。但是,您不需要每次都重新生成列表。由于您仍然希望填充数组,因此可以使用随机顺序并相应地选择剩余位置

例如,以以下数组大小7为例,最初不包含零:[0,0,1,0,1,1,0]

一旦你建立了零位置列表,在这里[0,1,3,6],只需将其随机排列即可。然后按照位置给出的顺序填充数组

例如,如果无序排列给出[3,1,6,0],则可以按如下方式填充数组:

[0, 0, 1, 0, 1, 1, 0]  <- initial configuration
[0, 0, 1, 1, 1, 1, 0]  <- First, position 3
[0, 1, 1, 1, 1, 1, 0]  <- Second, position 1
[0, 1, 1, 1, 1, 1, 1]  <- etc.
[1, 1, 1, 1, 1, 1, 1]
如果数组最初是用零填充的,那么就更容易了。初始列表是数组大小从0到N的整数列表。将其洗牌并应用相同的过程

如果不想填充整个数组,仍然需要构建整个列表,但可以在洗牌后将其截断,这意味着在某个点之后停止填充数组


当然,此解决方案要求阵列在每个步骤之间不发生变化。

您的第二个解决方案实际上是一个良好的开端。我假设它涉及到在每次更改后重新生成位置列表,如果您想填充整个数组,这将使其处于打开状态。但是,您不需要每次都重新生成列表。由于您仍然希望填充数组,因此可以使用随机顺序并相应地选择剩余位置

例如,以以下数组大小7为例,最初不包含零:[0,0,1,0,1,1,0]

一旦你建立了零位置列表,在这里[0,1,3,6],只需将其随机排列即可。然后按照位置给出的顺序填充数组

例如,如果无序排列给出[3,1,6,0],则可以按如下方式填充数组:

[0, 0, 1, 0, 1, 1, 0]  <- initial configuration
[0, 0, 1, 1, 1, 1, 0]  <- First, position 3
[0, 1, 1, 1, 1, 1, 0]  <- Second, position 1
[0, 1, 1, 1, 1, 1, 1]  <- etc.
[1, 1, 1, 1, 1, 1, 1]
如果数组最初是用零填充的,那么就更容易了。初始列表是数组大小从0到N的整数列表。将其洗牌并应用相同的过程

如果不想填充整个数组,仍然需要构建整个列表,但可以在洗牌后将其截断,这意味着在某个点之后停止填充数组


当然,这个解决方案要求数组在每个步骤之间不发生变化。

问题是我需要在另一个进程中使用中间数组状态。您需要使用1个数组,然后使用2个数组,依此类推?它们是在随机位置还是单调递增的随机序列是合适的?你需要一个1的数组,然后是2个1的数组,依此类推?对在每个步骤中添加的新选项应在剩余的零中随机选择第一个选项-5,12,6,2。第二,2,5,6,12。第二个选项合适吗?第一个选项-5,12,6,2。第二,2,5,6,12。第二个合适吗?我不知道你想说什么我需要在另一个进程中的中间数组状态你需要1个1的数组,然后是2个1的数组,依此类推?它们是在随机位置还是单调递增的随机序列是合适的?你需要一个1的数组,然后是2个1的数组,依此类推?对在每个步骤中添加的新选项应在剩余的零中随机选择第一个选项-5,12,6,2。第二,2,5,6,12。第二个选项合适吗?第一个选项-5,12,6,2。第二,2,5,6,12。第二个合适吗?我不知道你想说什么我认为这是最有效的方法,因为我不对修改它的结果数组进行操作谢谢我认为这是最有效的方法,因为我不对修改它的结果数组进行操作谢谢