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

C 如何修改O(n)列表长度函数以在O(1)中运行?,c,memory,data-structures,big-o,C,Memory,Data Structures,Big O,在此链接中,是ilist.c文件的副本 我需要做的是如何将此O(n)函数转换为在O(1)中运行: 我可以编辑ilist.c文件中的函数(我假设结构和图标),但我不能编辑ilist.h文件。我根本不知道如何转换到O(1),任何想法都会有帮助 作为提示,如果您更新了列表,使其在您对其执行操作时预计算长度,该怎么办?这样,您就可以让长度只返回O(1)中的预计算值。作为提示,如果您更新了列表,使其在您对其执行操作时预计算长度,该怎么办?通过这种方式,您可以让length只返回O(1)中的预计算值。您只

在此链接中,是ilist.c文件的副本

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


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

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

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

您只需将列表中的元素数存储在与其关联的对象中,随着每个添加的元素而增加,随着每个删除的元素而减少。然后,如果请求列表的总长度,您只需返回该数字


我看不出有任何其他方法可以做到这一点。遍历链表总是需要O(n)。

您只需将链表中的元素数存储在与其关联的对象中,每添加一个元素就增加一个,每删除一个元素就减少一个。然后,如果请求列表的总长度,您只需返回该数字


我看不出有任何其他方法可以做到这一点。遍历链表总是需要O(n)。

关键是允许您在ilist.h中的接口后面存储额外信息-考虑在添加和删除元素时将元素计数作为列表的一部分。然后返回ILENGHT的计数。

关键是允许您在ilist.h中的接口后面存储额外的信息-考虑在添加和删除元素时将元素计数作为列表的一部分。然后只返回ilength的计数。

如果在构建ilist时跟踪其大小,则只需在O(1)中返回已知大小。

如果在构建ilist时跟踪其大小,则只需在O(1)中返回已知大小

要相应更改的功能:
图标
i长度


要相应更改的函数:
图标
ilength

int-ilength(ilist-il){return 42;}//如果我添加了一个结构,那么O(1)
将其简化。。。指向节点数还是什么?你不需要指针。但是,是的,你需要修改结构。为什么没有人再格式化代码了?代码是为人类编写的,而在这里张贴作业的事实只能证明这一点!我已将问题文本回滚,因为您上次的编辑毫无意义。请将问题的原文原封不动地保留下来,这样可以帮助其他人寻找相同的答案(它还保留了上下文中的答案)。附言:如果其中一个答案帮助你解决了问题,请将其标记为正确答案
int-ilength(ilist-il){return 42;}//在那里,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;
}
struct ilist_node {
    struct ilist_node * rest;
    int first;
    int length; //new field!
};