又是大学生数据结构求解答

img

img


答案看不懂ˇ-ˇ什么0n0+1n1…=6了?书上也没看见这个公式啊

节点数 = 所有节点度数只和 + 1
n0 即 度数为 0 的结点数,同理,n1 度数为1 的节点数 ,n2 度数为2 的节点数,n3 度数为三的结点数。
根据公式
结点数 = 0n0 + 1n1 + 2n2 + 3n3 + 1;
结点数总数 又等于 n0 + n1 + n2 + n3

所以
n0 + n1 + n2 + n3 = 0n0 + 1n1 + 2n2 + 3n3 + 1
化简得到
n0 = 1 + n2 + 2n3

  • 你可以参考下这篇文章:猜想:对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变成n的一半。经过若干次这样的变换,一定会使n变为1。例如3->10->5->16->8->4->2->1。
  • 除此之外, 这篇博客: 记一次数据结构与算法作业:利用循环和递归输出1-N的正整数的程序分析比较中的 二、分析 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 第一张图表制作时由于在打游戏(滑稽),所以中间部分的数据偏高且无规律,后半段是挂着跑了一个晚上的结果,后面几张图都是在没有运行其他CPU占用大的程序所记录的,都可以看出无论是递归的还是循环,在运行时间上都与数据量N成明显的线性关系(中间的突变后面分析)。

    由于受电脑使用和电脑性能的限制,没有跑非常大的数据,最大只跑到了400w,在所测数据内,递归和循环的运行时间没有较大区别。

    在表中可以看到有部分地方时间发生了突变,一开始我也不知道具体原因,后猜测时由于测试时时间过长,系统屏保息屏和我唤醒屏幕导致,所以有了第四张图表,该表是在不息屏的情况且把输出窗口置顶测得(中间的断崖时由于前部分在导出视频所致)。为了严谨,取后部分数据进行比较,具体数据如图
    不关闭关闭
    图中第一列为数据量,第二三列为用时,长的那张图为不关闭显示所用时间(单位:s)。
    可以看出不关闭显示的情况下数据输出的时间明显大于关闭显示窗口输出时间,个人认为这应该是windows中刷新屏幕的机制吧,屏幕看不到的地方就不刷新吗,所以用时短。

    接下来就是内存的使用了,最后一张图非常完美的一条直线不用多说了,递归的内存使用随数据量线性增加,而循环不存在返回上层调用的问题,也不会有线性增长的内存开销。