数据结构:
线性结构:
顺序存储方式,顺序表
常见的顺序存储结构有:数组、队列、链表、栈
链式存储方式,链表
非线性结构:
常见的非线性结构有:二维数组、多维数组、广义表、树结构、图结构
实际案例问题:
判断子字符串在母字符串中第一次出现的位置:
暴力算法:
kmp算法:
汉诺塔问题:
用到了递归
分治算法
八皇后问题:
要求8x8个格子,不能同横、竖、斜。
回溯算法
马踏棋盘算法(骑士周游问题):
要求马在任意一个位置,每个格子只能走一次,使马把8x8个格子全部走完。
图的深度优化便利算法(DFS)
贪心算法
约瑟夫问题(丢手帕问题):
最短路径问题:
排序算法:
插入排序:
直接插入排序:
希尔排序:
选择排序:
简单选择排序:
堆排序:
在二叉树的基础上,
交换排序:
冒泡排序:
快速排序
归并排序:
基数排序(升级版的桶排序):
查找算法:
线性查找算法:
二分查找算法:
插值查找算法:
斐波那契(黄金分割法)查找算法:
Hash表:
树结构:
堆排序:
赫夫曼树:
赫夫曼编码:
二叉排序树:
平衡二叉树(AVL树):
多路查找树:
二叉树和B树:
2-3树:
B树、B+树和B*树:
图:
稀疏数组:
目的:压缩二维数组。
当一个二维数组中大部分元素为0,或者都为同一个值时,可以用稀疏数组来保持该数组。
把行和列和值的记录在一个小规模的数组中,从而缩小程序的规模。
原始的二维数组: 稀疏数组:
普通数组与稀疏数组转换的代码:
int row, col;row = col = 11;int[][] chessArr1 = new int[row][col];chessArr1[1][1] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 2;int count = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (chessArr1[i][j] != 0) {count++;}}}int[][] parseArr = new int[count + 1][3];parseArr[0][0] = row;parseArr[0][1] = col;parseArr[0][2] = count;count = 1;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (chessArr1[i][j] != 0) {parseArr[count][0] = i;parseArr[count][1] = j;parseArr[count][2] = chessArr1[i][j];count++;}}}// write to ioString FILE = "D:\\Java\\parseArr.txt";BufferedWriter bw = new BufferedWriter(new FileWriter(FILE));for (int[] ints : parseArr) {bw.write(Arrays.toString(ints));bw.newLine();}bw.close();// read from ioBufferedReader br = new BufferedReader(new FileReader(FILE));String tmpS = br.readLine();String[] tmpSS = tmpS.substring(1, tmpS.length() - 1).split(",");int[][] chessArr2 = new int[Integer.parseInt(tmpSS[0])][Integer.parseInt(tmpSS[1].trim())];while (true) {tmpS = br.readLine();if (tmpS == null || tmpS.isEmpty()) break;tmpSS = tmpS.substring(1, tmpS.length() - 1).split(",");chessArr2[Integer.parseInt(tmpSS[0])][Integer.parseInt(tmpSS[1].trim())] = Integer.parseInt(tmpSS[2].trim());}br.close();
队列:
队列可以使用数组结构或者链表结构来存储,先入先出,后进后出。
数组结构的队列:
程序员常用的十大算法:
二分查找算法:
分治算法:
动态规划算法:
KMP算法:
字符串匹配,
贪心算法:
普里姆算法:
克鲁斯卡尔算法:
迪杰斯特拉算法:
最短路径,