数据结构
c是面向过程,c++面向对象,JAVA面向对象,汇编是面向机器
一个树的深度和高度的区别:
深度:向下数,少的那个,层数,根节点为第一层
高度:向上看,楼层,层数+1
对于图求最小生成树的两种常用算法
Kruskal算法:只判断边,从边最小的开始,然后依次找次小的,需要先判断是否成环,如果成环,则跳过进行下一次比较
Prim算法:先要确定一个顶点,然后从这个顶点开始找与他相连权值最小的边对应的顶点,然后以这两个点为确定值,找与这两个点相关联的权值最小的点。同时也要判断是否成环,如果成环则找次小的。
二叉树:
最佳二叉树是哈夫曼树,不是平衡二叉树,哈夫曼树是指加权路径最短,哈夫曼树不一定是平衡二叉树
“*strcpy函数的作用是把含有’\0’结束符的字符串复制到另一个地址空间。*遇到/0就结束。
例题:
求图的最小生成树算法:
1.Prim算法(适合稠密图,贪心算法的运用,时间复杂度O(n+e),邻接表存储;O(n^2),图 )
2.Kruskal算法(适合稀疏图,贪心算法的运用,时间复杂度O(eloge),e为边数 )
求图最短路径算法:
1.DFS/BFS(单源)
2.Floyed算法(多源)
3.Dijkstra算法(单源)
4.Bellman-Ford算法(单源,负权)
DFS遍历:深度优先遍历
BFS遍历:广度优先遍历
1:简单选择 最好时间 O(n^2) 平均时间O(n^2) 最坏时间 O(n^2)
2:直接插入 最好时间 O(n) 平均时间O(n^2) 最坏时间 O(n^2)
3:冒泡排序 最好时间 O(n) 平均时间O(n^2) 最坏时间 O(n^2)
4:希尔排序 最好时间 O(n) 平均时间O(logn) 最坏时间 O(n^s) 1<s<2
5:快速排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(n^2)
6:堆排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn)
7:归并排序 最好时间 O(nlogn) 平均时间O(nlogn) 最坏时间O(nlogn)
节点数:度为二的节点有n个,度为零的有N+1个
在有N个结点的二叉链表中必定有2N个链域。
除根结点外,其余N-1个结点都有一个父结点。
所以,一共有N-1个非空链域,其余2N-(N-1)=N+1个为空链域。
线索数二叉树
求符合前中后序线索树定义
先根据二叉树写出对应的前中后序顺序,然后根据这个顺序分别判断每个节点,用虚线表示,
考虑每个结点,当左孩子为空时,指向前驱;右孩子为空时指向后继。(用虚线)
结点d,无左右孩子,则指向前驱null,后继b
结点b, 无左孩子,则指向前驱d
结点c,无左右孩子,则指向前驱b,后继a
结点a, 有左右孩子。
顺序表与链表的比较
- 基于空间的比较
- 存储分配的方式
- 顺序表的存储空间是静态分配的
- 链表的存储空间是动态分配的
- 存储密度 = 结点数据本身所占的存储量/结点结构所占的存储总量
- 顺序表的存储密度 = 1
- 链表的存储密度 < 1
- 存储分配的方式
- 基于时间的比较
- 存取方式
- 顺序表可以随机存取,也可以顺序存取
- 链表是顺序存取的
- 插入/删除时移动元素个数
- 顺序表平均需要移动近一半元素
- 链表不需要移动元素,只需要修改指针
- 存取方式
synchronized Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
notify(): 是唤醒一个正在等待该对象的线程。
notifyAll(): 唤醒所有正在等待该对象的线程。
wait指线程处于进入等待状态,形象地说明为“等待使用CPU”,此时线程不占用任何资源,不增加时间限制。
sleep指线程被调用时,占着CPU不工作,形象地说明为“占着CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
+=会自动强转(自动装箱功能),但是+必须要手动强转b=(byte)(a+b)
对于字符串:其对象的引用都是存储在栈中的,如果是【编译期已经创建好(直接用双引号定义的)的就存储在常量池中】,如果是【运行期(new出来的)才能确定的就存储在堆中】。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
进出栈操作
进栈 push()
入栈:在栈顶(数组的尾部)添加指定的元素,并返回新数组的长度。
出栈 pop()
出栈:删除栈顶(数组的尾部)的一个元素,并返回删除的元素。
其他
shift():删除数组头部的第一个元素,并返回删除的元素。
unshift():在数组头部的第一个元素前添加一个元素,并返回新数组的长度。
关于循环队列的一些计算问题:
front为队头、rear为队尾、maxSize为队列的总容量、m为队列中元素的个数:
队空:front = rear
队满:(rear + 1) % maxSize = front
进队:rear = (rear + 1) % maxSize
出队:front = (front + 1) % maxSize
ize为队列的总容量、m为队列中元素的个数:
队空:front = rear
队满:(rear + 1) % maxSize = front
进队:rear = (rear + 1) % maxSize
出队:front = (front + 1) % maxSize
队列中元素的个数 m = (rear - front + maxSize) % maxSize