lzytanxc 2022-04-07 21:30 采纳率: 100%
浏览 68
已结题

python 中链表尾部添加元素 append 函数的时间复杂度

1.python 中使用 l=deque()创建链表或队列这两种数据结构,以链表为例,尾部添加元素方式为:l.append(x)
2.不同于数组,我们知道链表读慢,写快,插入元素的时间复杂度为 O(1),这里不包括查找元素.deque 模块中使用 append()方法实现元素添加,即在尾部添加元素
3.这里有个疑问,尾部添加元素,即将要加入的元素 next 指针指向 None,原本的尾部元素 next 指针指向当前需添加的元素即可,这样看来时间复杂度为 O(1),但修改指针前需遍历整个链表找到最后一个元素,这样时间复杂度就是 O(N)了,时间复杂度就和数组是一样的?
4.所以 deque 模块的 append()方法尾部添加元素的时间复杂度到底是多少?
5.或者可以拿出 append()函数源码?看一下具体实现方式?
6.语言有点混乱,求解答!

  • 写回答

1条回答 默认 最新

  • ash062 2022-04-08 13:46
    关注

    1、导入collections模块查看路径

    img

    2、找到后,将文件夹拖入vs code,查找deque,看到其是从_collections模块导入的,蛋疼,_collections是内置模块

    img

    3、涉及到了知识盲区,去堆栈溢出上看一下,找到了个链接,https://hg.python.org/cpython/file/tip/Modules/_collectionsmodule.c

    deque_append_internal(dequeobject *deque, PyObject *item, Py_ssize_t maxlen)
    {
        if (deque->rightindex == BLOCKLEN - 1) {
            block *b = newblock();
            if (b == NULL)
                return -1;
            b->leftlink = deque->rightblock;
            CHECK_END(deque->rightblock->rightlink);
            deque->rightblock->rightlink = b;
            deque->rightblock = b;
            +
    −MARK_END(b->rightlink);
            deque->rightindex = -1;
        }
        Py_SIZE(deque)++;
        deque->rightindex++;
        deque->rightblock->data[deque->rightindex] = item;
        if (NEEDS_TRIM(deque, maxlen)) {
            PyObject *olditem = deque_popleft(deque, NULL);
            Py_DECREF(olditem);
        } else {
            deque->state++;
        }
        return 0;
    }
    
    static PyObject *
    deque_append(dequeobject *deque, PyObject *item)
    {
        Py_INCREF(item);
        if (deque_append_internal(deque, item, deque->maxlen) < 0)
            return NULL;
        Py_RETURN_NONE;
    }
    

    4、deque是双端链表。。。append是O(1)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月4日
  • 已采纳回答 4月26日
  • 创建了问题 4月7日

悬赏问题

  • ¥30 51单片机C语言数码管驱动单片机为AT89C52
  • ¥100 只改动本课件的 cal_portfolio_weight_series(decision_date), 跑完本课件。设计一个信息比率尽量高的策略。
  • ¥20 如何在visual studio 2022中添加ImageMagick库
  • ¥50 如何实现uniapp编译的微信小程序做可回溯视频
  • ¥15 求Houdini使用行家,付费。价格面议。
  • ¥15 前端高拍仪调用问题报错
  • ¥15 想用octave解决这个数学问题
  • ¥15 Centos新建的临时ip无法上网,如何解决?
  • ¥15 海康威视如何实现客户端软件对设备语音请求的处理。
  • ¥15 支付宝h5参数如何实现跳转