‘壹’ 设一棵树的度为3,其中没有度为2的结点,且叶子结点数为5。该树中度为3的结点数详细解析
有个公式结点数=分支数+1
设度为0的结点数为x,度为1的结点数y,度为2的结点数z,度为3的t,那么
x+y+z+t=0*x+1*y+2z+3t+1
x=z+2t+1
叶子结点就是度为0的结点,z=0你说t等于多少呢
‘贰’ 老王带你理解算法复杂度O(1),O(N),O(N^2)
理解算法复杂度是编程中的关键概念,它描述了算法的运行时间与问题规模之间的关系。我们来具体解析O(1)、O(N)、O(N^2)以及O(log^n)这几种复杂度:
O(1)表示常数复杂度。它意味着算法的执行时间不随问题规模的增加而改变。就像酒店管理员老王,他只需要快速找到指定房间的钥匙,无需根据房间数量进行额外的计算。代码中例如 i = 1 或 i = 3 都是O(1)复杂度的实例。
O(N)表示线性复杂度。随着问题规模的增加,算法的执行时间线性增长。老王开始通过给钥匙编号并将它们串起来,以便更快地找到指定房间的钥匙。当房间数量从100增加到10000时,查找时间显着增加,体现了线性增长的特性。
O(N^2)表示平方复杂度。在空间和时间上,算法的性能会随着问题规模的平方增加而急剧下降。老王开始通过将每一层的钥匙串起来,但在查找时,需要找到楼层编号和房间编号,使得算法复杂度变为O(N^2)。增加房间层数和房间数量会进一步加剧问题的复杂性。
O(log^n)表示对数复杂度。算法通过不断缩小查找范围来提高效率。老王通过从中间切开钥匙堆,每次都将查找范围减半,直到找到钥匙。这种方式在大量数据中查找时非常有效,大大减少了查找时间。
O(nlog^n)表示n对数复杂度,它是对数复杂度的扩展,表示算法性能随问题规模的线性增长而提高。例如,使用二分查找在有序列表中搜索元素就是O(log^n),之后以线性速度执行其他操作,总时间复杂度为O(nlog^n)。
在工作和学习中,我们应注重培养解决问题的思维能力,而非仅仅掌握单一的技能或工具。理解算法复杂度有助于我们在面对不同问题时,选择最合适的解决方案。例如,根据天气选择合适的交通工具,或者在不同的编程语言中选择最适合特定任务的语言。
对于不足之处,后续将进行补充。非常感谢关注我们公众号“嵌入式Linux”。您的每一次支持都是我们前进的动力。