Multithreading 多线程项目的Big-O

Multithreading 多线程项目的Big-O,multithreading,time-complexity,code-complexity,Multithreading,Time Complexity,Code Complexity,假设我创建了一个包含两个线程的项目。 他们中的大O是n和n,它们同时运行 当其中一个返回我想要的时,两个都停止。 话虽如此,该算法的复杂度是O(n),尽管其中一个线程的大O值是n,我说得对吗 另外,我做了研究,但没有一个答案能满足我的需要,因为所有答案都是关于一个被切成两半的问题(每个线程的O(n/2)而不是一个线程的O(n)),而我想一次开始解决两个问题,但第一个问题完成后,两个问题都停止了 对此的分析需要更加仔细 线程调度程序可能无法保证所有线程都能获得“公平”的执行时间。假设两个线程都从

假设我创建了一个包含两个线程的项目。 他们中的大O是nn,它们同时运行

当其中一个返回我想要的时,两个都停止。 话虽如此,该算法的复杂度是O(n),尽管其中一个线程的大O值是n,我说得对吗


另外,我做了研究,但没有一个答案能满足我的需要,因为所有答案都是关于一个被切成两半的问题(每个线程的O(n/2)而不是一个线程的O(n)),而我想一次开始解决两个问题,但第一个问题完成后,两个问题都停止了

对此的分析需要更加仔细


线程调度程序可能无法保证所有线程都能获得“公平”的执行时间。假设两个线程都从1开始计数,但是线程调度程序将线程A唤醒1个步骤,然后将线程B唤醒1个步骤,然后将线程A唤醒2个步骤,然后将线程B唤醒1个步骤,然后将线程A唤醒4个步骤,依此类推

在这种情况下,线程A将比线程B做更多的工作,因为调度程序给它更多的时间来完成工作。因此,如果线程B发出信号,要求线程A在B计数到n之后停止,那么线程A将在计数到2n-1之后停止。调度程序可能更不公平,因此A的运行时间不能由n的任何函数限定

因此,如果线程A选择在n之后终止自己!操作,那么它的运行时间只能以O(n!)为界,因为我们不能保证线程B将在该时间内完成它的n个操作并发送终止信号


现在假设线程调度器确实保证一个线程永远不会比另一个线程更受某个常量因素的青睐。在这种情况下,线程B中的算法将在线程B完成O(n)步后向线程a发送一个信号。由于线程A只能在同一时间内完成O(n)个步骤(否则它将比线程B更受欢迎,超过一个常数因子),因此线程A将在O(n)时间内终止


也就是说,线程A中的算法正在检查一个信号,并在接收到该信号时终止,这意味着O(n!)不能仅仅通过查看线程A所做的事情就导出为严格的上界;因为它有指令在接收到来自外部的信号时终止。因此,至少没有矛盾。

如果您确信
O(n)
线程将首先停止,那么您的推理肯定是正确的。如果不是,复杂性是
O(n!)
(与
O(n!/2)
的复杂性等级相同)。我认为你是对的。这两个线程的复杂度是
min(O(n),O(n!))
,当
n
变大时,它就是
O(n)
.Re,“O(n/2)”。这不是有效的大O符号。如果算法的时间复杂度为“O(n)”,并且您发现一项改进将运行时间减少了一半,那么时间复杂度仍然是O(n),因为实际运行时间仍然是n的线性函数@这是我的观点,O(n/2)等于O(n),所以它没有区别。我更倾向于说“O(n/2)”是一个无效的表达式,因此它不“等于”任何东西。。。但我对数学形式主义有点挑剔。在我看来,这是合理的,因为事实上,数学只是形式主义。