- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果有人能给我一个算法,让我:
创建一个包含0和1项的随机方阵,以便
每行每列都包含两个非零项,
两个非零项不能相邻,
所有可能的矩阵都是等价的。
现在,我设法实现点1和点2,执行以下操作:使用行和列的适当排列,可以将这样的矩阵转换为具有以下形式的块的对角块矩阵
1 1 0 0 ... 0
0 1 1 0 ... 0
0 0 1 1 ... 0
.............
1 0 0 0 ... 1
[1, ..., n]
的排列,可以像这样构建:在
1
行中选择一个1。包含此项的列在与1不同的行
a
中正好包含另一个等于1的项。同样,row
a
在列中包含另一个条目1,该列在row
b
中包含第二个条目1,依此类推。这将开始一个置换
1 -> a -> b ...
。
v
1 0 1 0 0 0 | 1
0 1 0 0 0 1 | 2
1 0 0 1 0 0 | 3
0 0 1 0 1 0 | 4
0 0 0 1 0 1 | 5
0 1 0 0 1 0 | 6
------------+--
1 2 3 4 5 6 |
1 -> 3 -> 5 -> 2 -> 6 -> 4 -> 1
。
n = 6
和相应的块矩阵的情况
1 1 0 0 0 0 | 1
0 1 1 0 0 0 | 2
1 0 1 0 0 0 | 3
0 0 0 1 1 0 | 4
0 0 0 0 1 1 | 5
0 0 0 1 0 1 | 6
------------+--
1 2 3 4 5 6 |
6 = 3 + 3
、
1
和
2
是相互不兼容的,还有
3
、
4
和
5
。选择一个随机行,比如
6
。
3
表示
[2, 5, 6, 4, 3, 1]
,
1 -> 2
,
2 -> 5
,
3 -> 6
,…这意味着块矩阵的行
2
将成为最终矩阵的第一行,行
5
将成为第二行,以此类推。
3
:
p = [3, ...]
3
:
4
、
5
和
6
兼容的其余行中随机选择下一行。假设我们选择
4
:
p = [3, 4, ...]
1
和
2
之间进行,例如
1
:
p = [3, 4, 1, ...]
p = [3, 4, 1, 5, 2, 6]
。
1 0 1 0 0 0 | 3
0 0 0 1 1 0 | 4
1 1 0 0 0 0 | 1
0 0 0 0 1 1 | 5
0 1 1 0 0 0 | 2
0 0 0 1 0 1 | 6
------------+--
1 2 3 4 5 6 |
p' = [6, 3, 5, 1, 4, 2]
来最终获得
0 1 0 1 0 0 | 3
0 0 1 0 1 0 | 4
0 0 0 1 0 1 | 1
1 0 1 0 0 0 | 5
0 1 0 0 0 1 | 2
1 0 0 0 1 0 | 6
------------+--
6 3 5 1 4 2 |
n=6
和partition
6 = 2 + 2 + 2
,遵循前面设置的构造规则可能会导致
p = [1, 3, 2, 4, ...]
。不幸的是,
5
和
6
是不兼容的,所以选择其中一个会使最后的选择变得不可能。我想我已经找到了所有导致死胡同的情况。我将用
r
表示剩下的一组选择:
p = [..., x, ?]
,
r = {y}
与
x
和
y
不兼容
p = [..., x, ?, ?]
,
r = {y, z}
与
y
不兼容(无法选择)
z
,
x
与
p = [..., ?, ?]
和
r = {x, y}
不兼容(任何选择都会导致情况1)
x
,
y
与
p = [..., ?, ?, ?]
,
r = {x, y, z}
和
x
循环连续(选择
y
或
z
将导致情况2,选择
x
将导致情况3)
z
,
y
且
p = [..., w, ?, ?, ?]
为3个循环(既不能选择
r = {x, y, z}
也不能选择
xwy
,选择
x
将导致情况3)
y
,
z
具有4个循环(任何选择都会导致情况4)
p = [..., ?, ?, ?, ?]
,
r = {w, x, y, z}
的
wxyz
是3个循环(选择
p = [..., ?, ?, ?, ?]
将导致情况4,选择任何其他将导致情况4)
最佳答案
(更新了测试结果、示例运行和下面的代码片段。)
您可以使用动态编程来计算每个状态产生的解的数量(以比暴力算法更有效的方式),并使用这些(预计算)值来创建等概率随机解。
以7x7矩阵为例;开始时,状态为:
0,0,0,0,0,0,0
0,1,0,0,1,0,0
0,1,1,0,1,0,1
1,1,1,0,2,0,1 -> 1,1,1,0 + 0,1
2,1,1,0 + 0,1
2,1,1,0 + 0,1 -> 0,1,1,2 + 0,1
0,0 + 0,1 + 0,0,2 + 0,1,0 + 0,1,0,1
size unique solutions states signatures max/row
4x4 2 9 6 2
5x5 16 73 26 8
6x6 722 514 107 40
7x7 33,988 2,870 411 152
8x8 2,215,764 13,485 1,411 596
9x9 179,431,924 56,375 4,510 1,983
10x10 17,849,077,140 218,038 13,453 5,672
11x11 2,138,979,146,276 801,266 38,314 14,491
12x12 304,243,884,374,412 2,847,885 104,764 35,803
13x13 50,702,643,217,809,908 9,901,431 278,561 96,414
14x14 9,789,567,606,147,948,364 33,911,578 723,306 238,359
15x15 2,168,538,331,223,656,364,084 114,897,838 1,845,861 548,409
16x16 546,386,962,452,256,865,969,596 4,952,501 1,444,487
17x17 155,420,047,516,794,379,573,558,433 12,837,870 3,754,040
18x18 48,614,566,676,379,251,956,711,945,475 31,452,747 8,992,972
19x19 17,139,174,923,928,277,182,879,888,254,495 74,818,773 20,929,008
20x20 6,688,262,914,418,168,812,086,412,204,858,650 175,678,000 50,094,203
row 0: 00000 -> 16 row 3: 101 -> 0
1112 -> 1
row 1: 20002 -> 2 1121 -> 1
00202 -> 4 1+01 -> 0
02002 -> 2 11+12 -> 2
02020 -> 2 1+121 -> 1
0+1+1 -> 0
row 2: 10212 -> 1 1+112 -> 1
12012 -> 1
12021 -> 2 row 4: 0 -> 0
12102 -> 1 11 -> 0
21012 -> 0 12 -> 0
02121 -> 3 1+1 -> 1
01212 -> 1 1+2 -> 0
state: 00000
options: 10100 10010 10001 01010 01001 00101
signature: 00202 02002 20002 02020 02002 00202
solutions: 4 2 2 2 2 4
state: 00101
options: 10010 01010
signature: 12102 02121
solutions: 1 3
state: 01111
options: 10100 10001 00101
signature: 11+12 1112 1+01
solutions: 2 1 0
state: 11211
options: 01010 01001
signature: 1+1 1+1
solutions: 1 1
state: 12221
options: 10001
0 0 1 0 1
0 1 0 1 0
1 0 1 0 0
0 1 0 1 0
1 0 0 0 1
function signature(state, prev) {
var zones = [], zone = [];
for (var i = 0; i < state.length; i++) {
if (state[i] == 2) {
if (zone.length) zones.push(mirror(zone));
zone = [];
}
else if (prev[i]) zone.push(3);
else zone.push(state[i]);
}
if (zone.length) zones.push(mirror(zone));
zones.sort(function(a,b) {return a.length - b.length || a - b;});
return zones.length ? zones.join("2") : "2";
function mirror(zone) {
var ltr = zone.join('');
zone.reverse();
var rtl = zone.join('');
return (ltr < rtl) ? ltr : rtl;
}
}
function memoize(n) {
var memo = [], empty = [];
for (var i = 0; i <= n; i++) memo[i] = [];
for (var i = 0; i < n; i++) empty[i] = 0;
memo[0][signature(empty, empty)] = next_row(empty, empty, 1);
return memo;
function next_row(state, prev, row) {
if (row > n) return 1;
var solutions = 0;
for (var i = 0; i < n - 2; i++) {
if (state[i] == 2 || prev[i] == 1) continue;
for (var j = i + 2; j < n; j++) {
if (state[j] == 2 || prev[j] == 1) continue;
var s = state.slice(), p = empty.slice();
++s[i]; ++s[j]; ++p[i]; ++p[j];
var sig = signature(s, p);
var sol = memo[row][sig];
if (sol == undefined)
memo[row][sig] = sol = next_row(s, p, row + 1);
solutions += sol;
}
}
return solutions;
}
}
function random_matrix(n, memo) {
var matrix = [], empty = [], state = [], prev = [];
for (var i = 0; i < n; i++) empty[i] = state[i] = prev[i] = 0;
var total = memo[0][signature(empty, empty)];
var pick = Math.floor(Math.random() * total);
document.write("solution " + pick.toLocaleString('en-US') +
" from a total of " + total.toLocaleString('en-US') + "<br>");
for (var row = 1; row <= n; row++) {
var options = find_options(state, prev);
for (var i in options) {
var state_copy = state.slice();
for (var j in state_copy) state_copy[j] += options[i][j];
var sig = signature(state_copy, options[i]);
var solutions = memo[row][sig];
if (pick < solutions) {
matrix.push(options[i].slice());
prev = options[i].slice();
state = state_copy.slice();
break;
}
else pick -= solutions;
}
}
return matrix;
function find_options(state, prev) {
var options = [];
for (var i = 0; i < n - 2; i++) {
if (state[i] == 2 || prev[i] == 1) continue;
for (var j = i + 2; j < n; j++) {
if (state[j] == 2 || prev[j] == 1) continue;
var option = empty.slice();
++option[i]; ++option[j];
options.push(option);
}
}
return options;
}
}
var size = 10;
var memo = memoize(size);
var matrix = random_matrix(size, memo);
for (var row in matrix) document.write(matrix[row] + "<br>");
function signature(state, prev) {
var zones = [], zone = [];
for (var i = 0; i < state.length; i++) {
if (state[i] == 2) {
if (zone.length) zones.push(mirror(zone));
zone = [];
}
else if (prev[i]) zone.push(3);
else zone.push(state[i]);
}
if (zone.length) zones.push(mirror(zone));
zones.sort(function(a,b) {return a.length - b.length || a - b;});
return zones.length ? zones.join("2") : "2";
function mirror(zone) {
var ltr = zone.join('');
zone.reverse();
var rtl = zone.join('');
return (ltr < rtl) ? ltr : rtl;
}
}
function memoize(n) {
var memo = [], empty = [];
for (var i = 0; i <= n; i++) memo[i] = [];
for (var i = 0; i < n; i++) empty[i] = 0;
memo[0][signature(empty, empty)] = next_row(empty, empty, 1);
return memo;
function next_row(state, prev, row) {
if (row > n) return 1;
var solutions = 0;
for (var i = 0; i < n - 2; i++) {
if (state[i] == 2 || prev[i] == 1) continue;
for (var j = i + 2; j < n; j++) {
if (state[j] == 2 || prev[j] == 1) continue;
var s = state.slice(), p = empty.slice();
++s[i]; ++s[j]; ++p[i]; ++p[j];
var sig = signature(s, p);
var sol = memo[row][sig];
if (sol == undefined)
memo[row][sig] = sol = next_row(s, p, row + 1);
solutions += sol;
}
}
return solutions;
}
}
var memo = memoize(10);
for (var i in memo) {
document.write("row " + i + ":<br>");
for (var j in memo[i]) {
document.write(""" + j + "": " + memo[i][j] + "<br>");
}
}
关于algorithm - 在行和列中具有两个不相邻的非零值的等概率随机平方二进制矩阵的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019047/
所以我得到了这个形状为 (31641600,2) 的 numpy 数组,其中有一些零值,如果不是很多的话。 我们称这个数组为 X。 正在做: print len(X) >>> 31641600 然后做
TL;DR:我有一个 IBOutlet ( UILabel ) 在 Storyboard 中正确连接。访问(展开)它在 viewDidLoad() 中工作正常...但几秒钟后它的值为零。一个观察点说,
我想用numpy数组进行非零cumsum。只需跳过数组中的零并应用 cumsum 即可。假设我有一个 np.数组 a = np.array([1,2,1,2,5,0,9,6,0,2,3,0]) 我的结
该代码运行,甚至产生预期的输出。但是,在构建日志中,我总是得到进程终止,状态为 2(0 分钟,5 秒) 或该日志的某些变体。 代码- #include #include void main() { p
我读了一些关于 TCP window scaling 的东西和 BDP (不太清楚),我无法弄清楚到底是什么原因导致发送方的 TCP 实现设置非零 WS,用户模式客户端程序是否会以某种方式影响它?我认
我有一个字典 { 'a': 'a', 'b': 0, 'c': {} } 我需要省略所有具有空值的键(0 是不被认为是空的)。所以,它的输出应该是 { 'a': 'a', 'b': 0 }。 对于 {
我想在 python 中的 pandas 数据帧上应用 cumsum,但没有零。只是我想保留零并在数据帧上执行 cumsum 。假设我有这样的数据框: import pandas as pd df =
我使用 getimagesize 函数获取图像的宽度和高度,如下所示: list($width,$height) = getimagesize($source_pic); 如何使用 IF 条件来检查
在 PHP 中(使用内置函数)我想用小数转换/格式化数字,以便只显示非零小数。但是,我的另一个要求是,如果它是一个没有十进制值的数字,我仍然希望显示为零。例子: 9.000 -> 9.0 9.100
我可以使用 df['TOTAL'] = df.sum(axis=1) 向此 DF 添加一个 TOTAL 列,它会像这样添加行元素: col1 col2 TOTAL 0 1.0 5.0
我正在玩 python 列表,我想在不使用列表时从内存中删除它。(我有大数据列表,可能有数千或数百万个元素..数据类型-> 浮点型) 我试过这段代码,看看删除在 python 中是如何工作的(示例)
我正在研究 Linux 设备驱动程序代码。我无法透露这段代码的具体用途。我会尽力解释我的情况。当我们收到 USB 中断,表明有来自 USB 的数据时,下面的代码将在中断上下文中执行。数据将以 URB
能力 manpage比较长,有些东西我没有完全理解。 例如,决定我们是否有权访问 CAP_NET_RAW 的函数看起来如何? 输入: a = 有效 uid 为 0 b = 有一些真实的/保存的/任何为
我正在创建一个测试用例,用于测试 TVIroom 类的委托(delegate)函数 didDisconnectwithError 是否可以被调用。为此,我需要向委托(delegate)函数传递一个空白
我想知道 numpy.nonzero/numpy.flatnonzero 返回的索引顺序。 我在文档中找不到任何关于它的内容。它只是说: A[nonzero(flag)] == A[flag] 虽然在
假设我有这样的数据框 id p1 p2 p3 p4 1 0 9 0 4 2 0 0 0 4 3 1 3 10 7 4 1 5 3
这个问题在这里已经有了答案: Division of integers in Java [duplicate] (7 个答案) 关闭 9 年前。 我有一个音量控制 slider 来控制 Androi
我们正在运行一个名为 Axe 的工具检查 HTML 页面的有效性和 508 合规性/可访问性。 此错误作为违规出现: Elements should not have tabindex greater
所以我有两个这样的模型 class ModelParent include Mongoid::Document field :name, :type => String has_one :
我是一名优秀的程序员,十分优秀!