Morris

本篇文章为Binary-Tree中遍历二叉树的进阶版本

二叉树的普通遍历有递归和迭代的方式 递归会有递归空间开销 迭代会有通过栈实现的空间开销 而Morris遍历可以将非递归遍历中的空间复杂度降为O(1) 利用的则是二叉树中大量的叶结点的左右孩子为空(空闲指针) 来实现的极限缩减空间 思想与线索二叉树很像 但不像线索二叉树一样需要开辟两个指针域

阅读全文 »

斐波那契数列

学习动态规划的时候见到了一个词语 叫做记忆化搜索 用于递归的剪枝 用空间的增大来换取时间的压缩

下面是关于斐波那契数列的代码例子

阅读全文 »

Go基本语法

程序入口

  1. 必须是main包 package main
  2. 必须是main方法 func main()
  3. 文件名不一定是main.go
  4. 文件夹名不一定是main

获取返回值

Go语言的main函数不支持任何返回值 因此return是不可以使用的
通过使用os.Exit()来返回状态

1
os.Exit(0)

获取命令行参数

Go语言的main函数不支持传入参数 在程序中直接通过os.Args获取命令行参数

1
2
3
4
5
func main() {
if len(as.Args) > 1 {
fmt.Println("It's", os.Args[1])
}
}

声明变量

1
2
3
4
5
6
7
8
//直接声明
var name string = "Ruojhen"
var id int = 123
var name = "shaoyuanhang@outlook.com" //不指定类型声明 靠编译器自动识别
/*但编译器自动识别会产生我们不需要的效果 例如: */
var decimal = 0.06 //因为右值带有小数点 所以在不指定类型的情况下 编译器将这个变量声明为float64 但很多时候我们不需要这么高的精度 因为高精度意味着占用内存空间就更大
var decimal float32 = 0.03
/*以上声明方式可以不赋予变量值 这样变量就会被初始化为初值 string就是空字符串 int就是0 float32/float64就是0.0 bool就是false 指针就是nil*/
阅读全文 »

std::function可以封装哪些实体 可以封装函数对象么

std::function介绍
类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)
通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴

阅读全文 »

红黑树

红黑树是一个能实现自平衡的二叉查找树
为何要引入红黑树:
首先来考虑一下二叉查找树 二叉查找树使用了二分查找的思想 查找所需的最大次数等同于二叉查找树的高度
但如果向二叉查找树一直插入一直比树结点更大或更小的值(例如结点由7 8 9 一直插入6 5 4 3 2 1) 二叉查找树就会失去平衡(1 2 3 4 5 6都是7的左孩子) 因此为了解决二叉查找树多次插入新结点导致的不平衡就需要引入红黑树

阅读全文 »