- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我最近偶然发现一个论坛声称可以使用数据结构在 O(n) 中解决 Josephus 问题。这里明确的选择是循环链表,但我声称它只能在 O(kn) 或 O(n^2) 中完成,除非你使用维基百科的数学递归/迭代 josephus 算法。首先,循环链表具有以下属性:搜索 O(n)、删除 O(1)、追加 O(1)。这假设 delete 是给定的节点,而 append 正在替换头或尾。
如果我们有一个循环节点列表,我们可以从起点找到要删除的节点,如下所示:
n = 6 个节点
k = 删除每第 3 个节点
起点:节点#0
节点:0、1、2、3、4、5
我们可以通过 (k + StartingPoint - 1) % n 来计算删除哪个节点。对于起点 = 0,我们有 (3 + 0 - 1) % 6 = 2。现在,3 将是我们的起点。 (3 + 3 - 1) % 5 = 0,当移动时是我们原来的 5 节点(即,数字现在是 0,1,2,3,4,因为原来的 2 已经不存在了)。这基本上就是数学版本的工作原理。对于链表,我们可以类似地推导出哪个节点需要删除。问题是我们必须前往这个节点。链表有 O(n) 搜索,这是一个问题。于是我们遍历到这个节点,将其删除,现在有n = n-1。我们找到下一个索引,进行 O(n) 搜索,得到 n = n_original - 2。这变成 n + (n-1) + (n-2) + ... = O(n^2)。
如果我们有一个双向链接的循环列表,那么如果节点离我们更近,我们就不必绕一圈。尽管如此,如果 k 小于 n,这是 O(k) 搜索,如果 k 大于 n,这是 O(n) 搜索(因为在到达起点之前你只能移动 n 个节点,但如果 k 很小,你只需要将 k 移开,你就不会到达你开始的地方)。
无论如何,我的观点是我不明白如何通过复杂度为 O(n) 的数据结构来做到这一点。维基百科上的解决方案是 O(n) 中一种非常优雅的数学方法,它显示了递归的强大功能(仅通过调用堆栈等来跟踪旧起点),但是当删除实际对象时,似乎不可能得到 O( n).我想展示我试图解决这个问题的尝试,而不仅仅是公然询问,所以有人知道在 O(n) 中使用某种数据结构来做到这一点的方法吗?谢谢!
最佳答案
我在 my blog 处用 O(n) 时间的循环链表解决了这个问题.该网站还有一个使用队列的 O(n) 解决方案和一个使用普通(非循环)链表的 O(n^2) 解决方案。使用循环链表,您总是向前移动,永远不会后退,正如您对双向链表所建议的那样。
例如,查看您的列表。你从 0 开始,数 3,删除项目 3。然后数 3,删除 0。然后数 3,删除 4。然后数 3,删除 2。然后数 3,删除 5。最后数 3,删除 1。总计所采取的步数为 kn,其中 n 是节点数,k 是步长。但这是节点数的 O(n),因为 n 是问题大小,k 是常数。
关于algorithm - Josephus 概率在 O(n) 中使用循环列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17432827/
接下来是我的代码: with open("test.txt") as f_in: for line in f_in: for char in line:
我们有一个六面骰子,面编号为 1 到 6。随着 n 的增加,在第 n 卷中第一次看到 1 的概率降低。我想找到最小的卷数,使得这个概率小于某个给定的限制。 def probTest(limit):
我只是想知道为什么运行下面的代码时出现错误。我正在尝试使用 numpy 为基于文本的游戏计算概率。下面的代码不是游戏本身的代码。这仅用于测试目的和学习。感谢您提前的答复,请对我宽容一点。 from n
我目前正在创建一个与多个arduino板通信的服务器软件。由于硬件原因,我使用UDP协议(protocol)。我有一个非常简单的机制,在大多数情况下,当包裹丢失时,它会重新发送包裹。我现在有两个问题:
我想在 LinearLayout 上添加一个 fling Action 。为此,我使用了以下代码。 public class NewsActivity extends Activity { .
下面是其中一个 facebook 谜题:我无法理解如何进行此操作。 你有 C 个容器、B 个黑球和无限数量的白球。您希望以一种方式在容器之间分配球,即每个容器至少包含一个球,并且选择白球的概率大于或等
我有一个希伯来语文本,就像 "×گض¸×¨ض´×™×،ض°×کוض¹×ں",我想将它转换为可读的 unicode 希伯来语字符。 我试过这段代码: const string Str = "×گض¸×
我正在尝试使用 Random.nextDouble() 获取 1.0 和 10.0 之间的随机双数: double number = 1.0 + (10.0-1.0) * Random.nextDou
我目前已经为二进制类实现了概率(至少我这么认为)。现在我想扩展这种回归方法,并尝试将其用于波士顿数据集。不幸的是,我的算法似乎被卡住了,我当前运行的代码如下所示: from sklearn impor
我在 2D 空间中有一小组数据点(大约 10 个),每个数据点都有一个类别标签。我希望根据现有数据点标签对新数据点进行分类,并关联属于任何特定标签类别的“概率”。 基于最近邻的标签来标记新点是否合适(
我正在做我的第一个 tensorflow 项目。 我需要获得给定输入和预期序列的 ctc 概率(不是 ctc 损失)。 在 python 或 c++ 中是否有任何 api 或方法可以做到这一点? 我更
我正在尝试通过 assignment 1斯坦福 cs244n 类(class)。问题 1b 强烈建议对 Softmax 函数进行优化。我设法得到了N维向量的Softmax。我还得到了 MxN 维矩阵的
我有一个预测算法的想法,该算法可以根据所选项目先前出现的顺序准确预测随机值,并分析模式以提高准确性。 基本上是一种接受两个参数的算法,一个是一组可能的选择;另一个是这些数字的历史,分析该模式并预测序列
自 HOURS 以来,我一直在努力思考这个 TopCoder 问题,但无法找到一个完美的解决方案,并找到了下面给出的一个使用得非常漂亮的解决方案! 我想弄清楚这个解决方案如何适用于给定的问题?而我当初
我只知道如何生成随机 boolean 值(真/假)。默认概率为 50:50 但是我怎样才能用我自己的概率生成真假值呢?假设它以 40:60 或 20:80 等的概率返回 true... 最佳答案 一种
对于以下示例,我如何计算 julia 中的百分位数/概率值/尾部区域 Example : N(1100, 200) #Normally distributed with mean 1100 & st
我正在尝试修改标准 kNN 算法来获取属于某个类别的概率,而不仅仅是通常的分类。我还没有找到太多关于概率 kNN 的信息,但据我了解,它的工作原理与 kNN 类似,不同之处在于它计算给定半径内每个类的
我正在使用 PostgreSQL 为我所有数据中的变量对计算经验概率密度函数。我试图确定在计算 PDF 之前索引是否/何时更有效。我像这样运行 EXPLAIN CREATE INDEX, EXPLAI
有谁知道当查询有偏移时如何在 MySql 中请求“实时结果集”(例如:select * from table limit 10 offset 20;)。它正在经历类似 的错误 'invalid use
unsigned long long int first( int b , int c){ int h=b; //int k; for(int k=b-1;k>c;k--){ b=b*k;
我是一名优秀的程序员,十分优秀!