如何修改O(n)列表长度函数以在O(1)中运行?

时间:2012-02-06 20:02:32

标签: c memory data-structures big-o

在此链接中,是ilist.c文件的副本 http://www.student.cs.uwaterloo.ca/~cs136/assignments/a5/

我需要做的是如何将此O(n)函数转换为在O(1)中运行:

// computes the number of elements in il
int ilength(ilist il)
{
    int i = 0;
    while (!iempty_huh(il))
    {
        i++;
        il = irest(il);
    }
    return i;
}

我可以编辑ilist.c文件中的函数(我假设结构和图标)但我无法编辑ilist.h文件。我根本不知道如何处理转换为O(1),任何想法都会有所帮助!

5 个答案:

答案 0 :(得分:6)

您可以将列表中元素的数量存储在与其关联的对象中,使用每个添加的元素增加它,并使用每个已删除的元素减少它。然后,如果请求列表的总长度,则只返回该数字。

我没有看到任何其他方式。遍历链接列表始终需要O(n)。

答案 1 :(得分:3)

struct ilist_node {
    struct ilist_node * rest;
    int first;
    int length; //new field!
};

相应更改的功能:iconsilength

答案 2 :(得分:2)

作为提示,如果您更新了列表,以便在对其执行操作时预先计算长度,该怎么办?这样,你可以让长度只返回O(1)中的预计算值。

答案 3 :(得分:2)

关键是你可以在ilist.h中的界面后面存储额外的信息 - 在你添加和删除它们时,考虑维护元素的数量作为列表的一部分。然后只返回ilength的计数。

答案 4 :(得分:2)

如果你在构建时跟踪ilist的大小,你可以在O(1)中返回已知的大小。