当前位置: 首页 > 知识库问答 >
问题:

下面提到的链表算法的时间复杂度是多少

堵飞鸿
2023-03-14

我正在编写一个算法,从链表中删除最后N个节点,并将其附加到链表的前面,如下所示

func removeAndAppendLastToFront(N: Int) {
    var slow: Node? = head
    var fast: Node? = head

    for _ in 0 ..< N - 1 {
        fast = fast?.next
    }

    var previous: Node?
    while fast?.next != nil {
        previous = slow
        slow = slow?.next
        fast = fast?.next
    }

    if previous != nil {
        previous?.next = nil
        fast?.next = head
        head = slow
    }
}

然而,我在计算该算法的时间复杂度时遇到了一些困难。

根据我的理解,第一个for循环应该是一个常数O(1)

 for _ in 0 ..< N - 1 {
        fast = fast?.next
 }

但是,第二个while循环会是O(logn)吗?考虑到快速指针在第一个for循环中以线性时间转发,而第二个while循环仅从存储的最后一个值继续?

  while fast?.next != nil {
        previous = slow
        slow = slow?.next
        fast = fast?.next
  }

这个算法的总时间复杂度是多少?

共有1个答案

皇甫心思
2023-03-14

当第一个循环O(1)从开始到第n个元素时,它是如何运行的?因为n是你的最后一个元素,你实际上是在整个列表中递归,你的第一个循环实际上有O(N),因为你在最后一个元素,它不应该有下一个元素,它不应该快吗?。下一个!=nil条件false?

 类似资料:
  • 注:∈/ 意思是不在,我不能在代码中输入。 这个问题可能与一些帖子重复。 理解Dijkstra算法的时间复杂度计算 Dijkstra算法的复杂性 Dijkstras算法的复杂性 我读过它们,甚至读过Quora上的一些帖子,但仍然无法理解。我在伪代码中添加了一些注释,并试图解决它。我真搞不懂为什么它是O(E log V)

  • 我有一个算法可以检查是否可以解决游戏行。游戏行是一个正整数数组,其中最后一个元素为 0。游戏标记从索引 0 开始,沿着数组移动它所在的整数指示的步数。 例如,[1,1,0]返回true,而[1,2,0]返回false。标记也可以向左或向右移动以解决游戏。也就是说,[3,3,2,2,0]是可解的。 我尝试了一些游戏行示例,并计算了最坏情况下的时间复杂度: 其他情况下给我的数字,我找不到与输入大小的关

  • 问题内容: 我写了以下课程: 然后,在我的方法中,我创建了一个,向其中添加了一些具有“ X”和“ angle”字段的对象。 然后,我使用: 这种排序方法的复杂性是什么? 问题答案: 您可能已经阅读了有关Collections排序的文档,但是这里适合您: 排序算法是一种修改的mergesort(如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。

  • 问题内容: 我当时在看这个pycon演讲,时间是34:30,发言人说,可以在中完成获取元素列表中最大的元素的操作。 那怎么可能?我的理解是,创建堆将是,但是其本身的复杂性是还是(以及(实际的算法是什么))? 问题答案: 扬声器在这种情况下是错误的。实际费用为。仅在可迭代的第一个元素上调用堆化。就是那个,但如果小于,则微不足道。然后,将所有剩余的元素一次通过添加到此“小堆”中。每次调用需要花费时间。

  • 问题陈述:给定一个非空字符串s和一个包含非空单词列表的字典字词,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。 我的解决方案: 我不确定时间和空间的复杂性。我认为它应该是2^n,其中n是给定字符串s的长度。谁能帮我证明时间和空间的复杂性? 我还有以下几个问题: 如果我不在GetAllSences函数中使用memo,那么在本例中时间复杂度是多少? 还有比这更好

  • 我已经浏览了Google和Stack Overflow搜索,但是我没有找到一个关于如何计算时间复杂度的清晰而直接的解释 对于下面这样简单的代码: 比如下面这样的循环: 这将只执行一次。时间实际上计算为而不是声明。