- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题:
那么二进制代码就是我们要找的。例如:
Given k is 2 (for example, the length of the matched binary code is 5. Code "10011" is a match, because its substring of lenght 2 are "10","00","01","11", and all of them occured in the binary code only once.). all of such binary codes are "00110", "10011", "11001", "01100"
我正在寻找一种算法来尽快找到给定 k 的所有二进制代码。
最佳答案
我们可以将二进制代码建模为长度k
的所有组合的排列。我们有 2^k
组合,它们可以排列成 (2^k)!
排列。代码比较多,但是满足需求3。长度2^k+k-1
表示k-1
每个长度组合的后缀k
必须是下一个组合的 k-1
前缀。当每个新组合添加一个新符号时,我们有第一个长度 k
2^k - 1
长度 k
的新组合。所以我们可以非常快地修剪所有这些 (2^k)!
。
我们可以将长度 k
的组合建模为二进制数。然后每个“代码”可以从这些数字中的一个开始,下一个数字必须从前一个数字开始有 k-1
位,并添加一个新的位 0 或 1。这可以通过向左移动来完成1 并添加 0 或 1,然后屏蔽到 k
位。新号码只有在没有被使用过的情况下才能使用,所以我们必须记住使用过的号码。我们将生成满足上述要求的长度为 2^k
的序列。结果,我们将这些序列转换为相应的二进制代码。这意味着我们使用第一个数字的所有位,并从所有下一个数字中添加最少的位。或者我们可以使用所有数字的最高位并从最后一位开始添加所有位。
Erlang 中的结果代码:
-module(binary_code).
-export([gen/1]).
gen(K) ->
N = (1 bsl K) - 1,
gen(N, K, lists:seq(0, N)).
gen(Mask, K, L) ->
[ [ $0 + B || <<B:1>> <= <<X:K>> ] ++ V
|| X <- L, V <- gen(Mask, Mask, X, [X]) ].
gen(_, 0, _, _) -> [[]];
gen(Mask, N, Prev, Prefix) ->
P = (Prev bsl 1) band Mask,
[ [$0 + (X band 1)|V] || X <- [P, P bor 1],
not lists:member(X, Prefix),
V <- gen(Mask, N-1, X, [X|Prefix])
].
结果:
44> binary_code:gen(1).
["01","10"]
45> binary_code:gen(2).
["00110","01100","10011","11001"]
46> binary_code:gen(3).
["0001011100","0001110100","0010111000","0011101000",
"0100011101","0101110001","0111000101","0111010001",
"1000101110","1000111010","1010001110","1011100010",
"1100010111","1101000111","1110001011","1110100011"]
47> binary_code:gen(4).
["0000100110101111000","0000100111101011000",
"0000101001101111000","0000101001111011000",
"0000101100111101000","0000101101001111000",
"0000101111001101000","0000101111010011000",
"0000110010111101000","0000110100101111000",
"0000110101111001000","0000110111100101000",
"0000111100101101000","0000111101001011000",
"0000111101011001000","0000111101100101000",
"0001001101011110000","0001001111010110000",
"0001010011011110000","0001010011110110000",
"0001011001111010000","0001011010011110000",
"0001011110011010000","0001011110100110000",
"0001100101111010000","0001101001011110000",
"0001101011110010000","0001101111001010000",
[...]|...]
48> length(v(47)).
256
49> binary_code:gen(5).
["000001000110010100111010110111110000",
"000001000110010100111011010111110000",
"000001000110010100111110101101110000",
"000001000110010100111110110101110000",
"000001000110010101101001110111110000",
"000001000110010101101001111101110000",
"000001000110010101101110100111110000",
"000001000110010101101111101001110000",
"000001000110010101110110100111110000",
"000001000110010101111101101001110000",
"000001000110010110101001110111110000",
"000001000110010110101001111101110000",
"000001000110010110111010100111110000",
"000001000110010110111110101001110000",
"000001000110010111011010100111110000",
"000001000110010111110110101001110000",
"000001000110011101001010110111110000",
"000001000110011101010010110111110000",
"000001000110011101101001010111110000",
"000001000110011101101010010111110000",
"000001000110011111010010101101110000",
"000001000110011111010100101101110000",
"000001000110011111011010010101110000",
"000001000110011111011010100101110000",
"000001000110100101011001110111110000",
"000001000110100101011001111101110000",
"000001000110100101011100111110110000",
"000001000110100101011101100111110000",
[...]|...]
50> length(v(49)).
65536
似乎二进制代码的数量是2^(2^(k-1))
。它迅速升级。要为更高的k
生成二进制代码,我建议使用C 或ASM。 (对于 k=6
,2^32 = 4,294,967,296。)
编辑:
有我的attempt在 C 中实现它并且效果很好。
$ ./binary_code 1
01
10
$ ./binary_code 2
00110
01100
10011
11001
$ ./binary_code 3
0001011100
0001110100
0010111000
0011101000
0100011101
0101110001
0111000101
0111010001
1000101110
1000111010
1010001110
1011100010
1100010111
1101000111
1110001011
1110100011
$ time ./binary_code 4 | wc
256 256 5120
real 0m0.003s
user 0m0.000s
sys 0m0.000s
$ time ./binary_code 5 | wc
65536 65536 2424832
real 0m0.053s
user 0m0.088s
sys 0m0.000s
$ ./binary_code 6 | head -n 20
000000100001100010100011100100101100110100111101010111011011111100000
000000100001100010100011100100101100110100111101101110101011111100000
000000100001100010100011100100101100110100111111010101110110111100000
000000100001100010100011100100101100110100111111011011101010111100000
000000100001100010100011100100101100110101011101001111011011111100000
000000100001100010100011100100101100110101011101001111110110111100000
000000100001100010100011100100101100110101011101101111010011111100000
000000100001100010100011100100101100110101011101101111110100111100000
000000100001100010100011100100101100110101011110110111010011111100000
000000100001100010100011100100101100110101011111101101110100111100000
000000100001100010100011100100101100110110100111101010111011111100000
000000100001100010100011100100101100110110100111101110101011111100000
000000100001100010100011100100101100110110100111111010101110111100000
000000100001100010100011100100101100110110100111111011101010111100000
000000100001100010100011100100101100110110101011101001111011111100000
000000100001100010100011100100101100110110101011101001111110111100000
000000100001100010100011100100101100110110101011101111010011111100000
000000100001100010100011100100101100110110101011101111110100111100000
000000100001100010100011100100101100110110101011110111010011111100000
000000100001100010100011100100101100110110101011111101110100111100000
$ time ./binary_code 6 | wc
4294967296 4294967296 300647710720
real 123m18.854s
user 183m36.848s
sys 2m33.652s
$ time ./binary_code 6 > /dev/null
real 63m5.656s
user 62m50.808s
sys 0m11.072s
对于 k=6
,它可以生成 75MB/s 的二进制代码。我也试过解决它without recursion但是 gcc
必须在引擎盖下做一些惊人的事情,因为非递归版本比我的第一个直接递归版本慢大约 10%。
关于string - 如何找到给定条件描述的所有字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20422126/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!