C中未排序与已排序链表的效率

时间:2014-02-15 19:34:44

标签: c

对于编程项目,我创建了两个链表程序:未排序的链表和排序的链表。只要未在列表中找到该值,未排序的链接列表程序就会将值添加到列表的末尾。如果在列表中找到该值,则删除包含该值的节点。排序的linked_list程序的唯一区别是,如果在列表中找不到值,而不是仅将值添加到末尾,程序将查找插入值的适当空间,以便始终保持存储库的排序订购。我有一个“stepcounter”变量,即使在遍历链表时,每次将程序中的指针重新分配给指向不同指针的指针时,该变量基本上会递增。我将此变量输出到屏幕,以便让我了解程序的效率。奇怪的是,如果我在排序列表和未排序列表上运行相同的操作,则未排序列表的步骤数或工作量大于排序列表。这对我来说似乎非常违反直觉,但我查看了我的代码,我很确定我在所有相同的地方都增加了,所以我无法想出为什么未排序的链表操作会有更多的步骤比排序的。有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

如果您真的跟踪指针分配,那么就像

一样走路
while (p && (p.value != input) && (p.next != NULL)) p = updatePointer(p.next);

(假设updatePointer处理您的计数)为您检查的每个节点执行其中一个。

  • 要知道项目是否在未排序列表中,您必须查看列表中的每个节点。 (也就是说,你必须使用我上面的代码)

  • 要在排序列表上执行相同的操作,您只需要继续查看,直到您通过项目为本身的项目。这意味着像

    这样的代码
    while (p && (p.value < input) && (p.next != NULL)){ 
        p = updatePointer(p.next);
    }
    if (p.value == input) //...
    

假设随机分布(即无序输入),您希望第二种情况需要大约1/2的比较。

答案 1 :(得分:1)

假设您要在两个列表中插入1000个数据,并且数据是纯随机顺序但是 值1到1000。

另外假设两个列表已经填充了500个未排序列表的纯随机顺序数据项和排序列表中的排序顺序。

对于未排序的列表,您必须检查每个项目以找到可能的双打,这导致 指向每个被访问节点的指针。

对于排序列表,您只需要以这种方式向前搜索,直到第一个元素 出现在列表中的值更大。

将1000个元素插入已填充的列表中,此类命中的几率为50% 共有500个项目,总值范围为1到1000。 这将创建所有操作的50%作为替换插入,这将使未排序列表 与排序列表相比,检查其他项目。 对于未排序的列表,插入本身更便宜(1步而不是4步)。