具有某些性质的第k个二进制数的查找算法

abc

假设我们将考虑具有长度2nn可能约为的二进制数1000我们正在寻找具有以下属性的kth数字(k受限制10^9):

  • 的金额1's等于以下金额0's#(1) = #(0)
  • 这个数字的每个前缀都有到ATLEAST包含尽可能多0's1's这可能是更容易否定句,这是后明白:没有前缀,这将包含更多的1's0's

基本上就是这样。为了清楚起见,让我们做一些示例:n=2k=2我们必须采用length的二进制数2n

0000
0001
0010
0011
0100
0101
0110
0111
1000
and so on...

现在我们必须找到2nd满足这两个要求的编号。因此,我们看到的0011是第一个,0101第二个。如果我们更改k=3,则答案不存在,因为存在具有相同数量的相反位数的数字,但对于0110,则具有前缀,011因此数字不满足第二个约束,并且所有具有1最高有效位的数字都将是相同的

那么到目前为止我做了什么来找到算法?

好吧,我的第一个想法是生成所有可能的位设置,并检查它是否具有这两个属性,但是生成它们全部都需要O(2^(2n)),这不是的选择n=1000

另外,我意识到没有必要检查所有小于0011for n=2000111forn=3等等的数字,以此类推...坦白地说,那些最高有效位的一半保持“不变”的数字,因为这些数字不可能满足#(1) = #(0)条件。使用它,我可以减少n一半,但并没有太大帮助。而不是永远2 *我有永远运行算法。它仍然很O(2^n)复杂,太大了。

对算法有任何想法吗?

结论

阅读Andy Jones帖子后,根据我的想法创建了本文。

首先,我不会发布我使用过的代码,因为以下内容来自Andy的Kasa 2009帖子中的第6点您所要做的就是考虑nr我所说的k取消Dyck单词算法的排名,将有助于我们更快地找到答案。但是它有一个瓶颈。

while (k >= C(n-i,j))

考虑到这一点n <= 1000,加泰罗尼亚语的数字甚至可能非常庞大C(999,999)我们可以使用一些大数算法,但是另一方面,我想出了一点技巧来超越它并使用标准整数。

我们不希望加泰罗尼亚语数字大于多少才真正有多大k因此,现在我们将创建加泰罗尼亚语数字,在n x n表中缓存部分和

...                                     ...
5 |                              42     ...
4 |                        14    42     ...
3 |                   5    14    28     ...
2 |             2     5     9    14     ...
1 |       1     2     3     4     5     ...
0 | 1     1     1     1     1     1     ...
   ----------------------------------   ...
    0     1     2     3     4     5     ...

生成它很简单:

C(x,0) = 1
C(x,y) = C(x,y-1) + C(x-1,y)  where y > 0 && y < x
C(x,y) = C(x,y-1) where x == y

因此,我们只能看到以下内容:

C(x,y) = C(x,y-1) + C(x-1,y)  where y > 0 && y < x

会导致溢出。

让我们在此停止并提供定义。

k-flow-不是整数的实际溢出,而是信息的值C(x,y)大于k

我的想法是在每次运行上述公式后检查是否C(x,y)大于k大于总和-1如果我们放了它(-1它会充当标记),那就k-flow已经发生了。我想很明显,如果将k-flow数字与任何正数求和,则仍然k-flowed特别是2个k-flowed数字之和k-flowed

我们最后要证明的是,不可能产生真正的溢出。真正的溢出可能仅在我们总结a + b其中一个是非溢出的情况下才会发生k-flowed但总的来说,它们才产生了真正的溢出。

当然不可能,因为最大值可以描述为a + b <= 2 * k <= 2*10^9 <= 2,147,483,647不等式中的最后一个值是带符号的int值。我还假设int具有32位,就像我的情况一样。

安迪·琼斯(Andy Jones)

您描述的数字对应于Dyck单词Kasa 2009的Pt 2提供了一种简单的算法,可以按字典顺序对其进行枚举。如果您想做进一步的阅读,它的参考应该会有所帮助。

顺便说一句(在写这篇文章时,请注意我半睡着了,所以可能是错误的),维基百科文章指出,戴克单词的长度2nn加泰罗尼亚语数字C(n)您可能希望找到最小的n那个C(n),大于k您要寻找的那个,然后从枚举Dyck单词X^n Y^n

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从二进制数中获取最后5个二进制位?

来自分类Dev

在n个元素的数组中使用二进制搜索查找k个不同的键

来自分类Dev

二进制长除法算法

来自分类Dev

查找没有二进制文件的路径

来自分类Dev

二进制数具有相同的0和1

来自分类Dev

具有二进制数的strrev()

来自分类Dev

Prolog + clpfd:具有值的简单二进制数解析器

来自分类Dev

正则表达式匹配具有两个以上设置位的二进制数

来自分类Dev

Python二进制乘法算法?

来自分类Dev

在ArrayList中使用二进制搜索来查找具有给定前缀的单词

来自分类Dev

返回二进制搜索树中第k个值的函数

来自分类Dev

具有“年龄”特征的二进制分类数据集,其中某些值缺失

来自分类Dev

生成二进制矩阵的算法

来自分类Dev

读取具有二进制内容的XML

来自分类Dev

二进制搜索算法

来自分类Dev

此递归二进制搜索如何工作?用于在bst中找到第k个最小的节点

来自分类Dev

Bash:具有二进制范围的循环,保持控制值二进制

来自分类Dev

查找所有“非二进制”文件

来自分类Dev

二进制长除法算法

来自分类Dev

二进制搜索答案算法

来自分类Dev

查找基值和功效均为二进制的二进制值的功效的最佳算法是什么?

来自分类Dev

查找没有二进制文件的路径

来自分类Dev

二进制数具有相同的0和1

来自分类Dev

打印二进制递归算法

来自分类Dev

查找大X的X个具有n个非零数字的二进制数字-Matlab

来自分类Dev

Prolog + clpfd:具有值的简单二进制数解析器

来自分类Dev

在ArrayList中使用二进制搜索来查找具有给定前缀的单词

来自分类Dev

二进制搜索树?算法

来自分类Dev

SQL 或 R:从具有二进制数据类型的列中查找并显示所有 '1' 的索引并存储在另外 1 个或多个列中

Related 相关文章

  1. 1

    从二进制数中获取最后5个二进制位?

  2. 2

    在n个元素的数组中使用二进制搜索查找k个不同的键

  3. 3

    二进制长除法算法

  4. 4

    查找没有二进制文件的路径

  5. 5

    二进制数具有相同的0和1

  6. 6

    具有二进制数的strrev()

  7. 7

    Prolog + clpfd:具有值的简单二进制数解析器

  8. 8

    正则表达式匹配具有两个以上设置位的二进制数

  9. 9

    Python二进制乘法算法?

  10. 10

    在ArrayList中使用二进制搜索来查找具有给定前缀的单词

  11. 11

    返回二进制搜索树中第k个值的函数

  12. 12

    具有“年龄”特征的二进制分类数据集,其中某些值缺失

  13. 13

    生成二进制矩阵的算法

  14. 14

    读取具有二进制内容的XML

  15. 15

    二进制搜索算法

  16. 16

    此递归二进制搜索如何工作?用于在bst中找到第k个最小的节点

  17. 17

    Bash:具有二进制范围的循环,保持控制值二进制

  18. 18

    查找所有“非二进制”文件

  19. 19

    二进制长除法算法

  20. 20

    二进制搜索答案算法

  21. 21

    查找基值和功效均为二进制的二进制值的功效的最佳算法是什么?

  22. 22

    查找没有二进制文件的路径

  23. 23

    二进制数具有相同的0和1

  24. 24

    打印二进制递归算法

  25. 25

    查找大X的X个具有n个非零数字的二进制数字-Matlab

  26. 26

    Prolog + clpfd:具有值的简单二进制数解析器

  27. 27

    在ArrayList中使用二进制搜索来查找具有给定前缀的单词

  28. 28

    二进制搜索树?算法

  29. 29

    SQL 或 R:从具有二进制数据类型的列中查找并显示所有 '1' 的索引并存储在另外 1 个或多个列中

热门标签

归档