数据结构和算法

数据结构:
线性结构:

顺序存储方式,顺序表

常见的顺序存储结构有:数组、队列、链表、栈

链式存储方式,链表

非线性结构:

常见的非线性结构有:二维数组、多维数组、广义表、树结构、图结构

实际案例问题:
判断子字符串在母字符串中第一次出现的位置:

暴力算法:

kmp算法:

汉诺塔问题:

用到了递归

分治算法

八皇后问题:

要求8x8个格子,不能同横、竖、斜。

回溯算法

马踏棋盘算法(骑士周游问题):

要求马在任意一个位置,每个格子只能走一次,使马把8x8个格子全部走完。

图的深度优化便利算法(DFS)

贪心算法

约瑟夫问题(丢手帕问题):
最短路径问题:
排序算法:
插入排序:
直接插入排序:
希尔排序:
选择排序:
简单选择排序:
堆排序:

在二叉树的基础上,

交换排序:
冒泡排序:
快速排序
归并排序:
基数排序(升级版的桶排序):
查找算法:
线性查找算法:
二分查找算法:
插值查找算法:
斐波那契(黄金分割法)查找算法:
Hash表:
树结构:
堆排序:
赫夫曼树:
赫夫曼编码:
二叉排序树:
平衡二叉树(AVL树):
多路查找树:
二叉树和B树:
2-3树:
B树、B+树和B*树:
图:
稀疏数组:

目的:压缩二维数组。

当一个二维数组中大部分元素为0,或者都为同一个值时,可以用稀疏数组来保持该数组。

把行和列和值的记录在一个小规模的数组中,从而缩小程序的规模。

原始的二维数组: 稀疏数组:

普通数组与稀疏数组转换的代码:

java 复制代码
    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 io
    String 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 io
    BufferedReader 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算法:

字符串匹配,

贪心算法:
普里姆算法:
克鲁斯卡尔算法:
迪杰斯特拉算法:

最短路径,

弗洛伊德算法:
马踏棋盘算法:
相关推荐
Leighteen17 分钟前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
峥无32 分钟前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波43 分钟前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
名字还没想好☜1 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫1 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao1 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬2 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛2 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
早睡早起身体好1232 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
daad7773 小时前
记录matlab状态机demo
java·网络·matlab