From 151249bf2eda3c190b3b6c61cdcf5d4cc8c5b18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=EF=BC=9ARong=E5=A7=90=E5=A7=90?= =?UTF-8?q?=E5=A5=BD=E5=8F=AF=E7=88=B1?= Date: Thu, 26 Oct 2023 14:19:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(markdownlint-cli):=20=E6=B7=BB=E5=8A=A0mar?= =?UTF-8?q?kdown=E6=96=87=E6=A1=A3=E6=A0=A1=E9=AA=8C=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81lint=E8=84=9A=E6=9C=AC=E8=87=AA=E5=8A=A8=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .markdownignore | 3 + .markdownlint.js | 68 + CHANGELOG.md | 72 +- README.md | 123 +- docs/big-event-history.md | 8 +- docs/changelog.md | 2 - docs/job-poster-bytedance.md | 45 +- docs/manuscripts/ccp/readme.md | 3 - docs/manuscripts/cn/readme.md | 4 +- docs/manuscripts/cn/传输层/1.提供的服务.md | 4 +- docs/manuscripts/cn/传输层/2.UDP协议.md | 4 +- docs/manuscripts/cn/传输层/3.TCP协议.md | 4 +- docs/manuscripts/cn/传输层/4.总结.md | 4 +- docs/manuscripts/cn/体系结构/1.引论.md | 4 +- .../cn/体系结构/2.体系结构与参考模型.md | 4 +- docs/manuscripts/cn/应用层/1.应用模型.md | 4 +- docs/manuscripts/cn/应用层/2.DNS.md | 4 +- docs/manuscripts/cn/应用层/3.FTP.md | 4 +- docs/manuscripts/cn/应用层/4.HTTP.md | 4 +- docs/manuscripts/cn/应用层/4.电子邮件.md | 4 +- docs/manuscripts/cn/应用层/5.总结.md | 4 +- docs/manuscripts/cn/数据链路层/1.通信基础.md | 4 +- docs/manuscripts/cn/数据链路层/2.组帧.md | 4 +- docs/manuscripts/cn/数据链路层/3.差错控制.md | 4 +- .../cn/数据链路层/4.流量控制&可靠传输.md | 4 +- .../cn/数据链路层/5.介质访问控制.md | 4 +- docs/manuscripts/cn/数据链路层/6.局域网.md | 4 +- docs/manuscripts/cn/数据链路层/7.广域网.md | 4 +- docs/manuscripts/cn/数据链路层/7.通信设备.md | 4 +- docs/manuscripts/cn/数据链路层/8.总结.md | 4 +- docs/manuscripts/cn/物理层/1.通信基础.md | 4 +- docs/manuscripts/cn/物理层/2.传输介质.md | 4 +- docs/manuscripts/cn/物理层/3.物理层设备.md | 4 +- docs/manuscripts/cn/物理层/4.总结.md | 4 +- docs/manuscripts/cn/网络层/1.基本功能.md | 4 +- docs/manuscripts/cn/网络层/2.路由算法.md | 4 +- docs/manuscripts/cn/网络层/3.路由协议.md | 4 +- docs/manuscripts/cn/网络层/4.IPV4.md | 4 +- docs/manuscripts/cn/网络层/5.IPV6.md | 4 +- docs/manuscripts/cn/网络层/6.IP组播&移动IP.md | 4 +- docs/manuscripts/cn/网络层/7.网络层设备.md | 4 +- docs/manuscripts/cn/网络层/8.总结.md | 4 +- .../ds/basic-introduction/1.basic_concepts.md | 12 - .../2.three_elements_of_data_structure.md | 22 +- .../3.algorithm_and_algorithm_evaluation.md | 14 +- .../ds/basic-introduction/readme.md | 3 +- .../1.basic_concept_and_operation.md | 10 - .../2.sequential_representation.md | 36 +- .../linear-table/3.chained_representation.md | 77 +- docs/manuscripts/ds/linear-table/4.总结.md | 17 - docs/manuscripts/ds/linear-table/readme.md | 2 +- docs/manuscripts/ds/readme.md | 19 +- docs/manuscripts/ds/串/1.基本概念.md | 4 +- docs/manuscripts/ds/串/2.简单的模式匹配.md | 4 +- docs/manuscripts/ds/串/3.KMP算法.md | 4 +- docs/manuscripts/ds/串/4.总结.md | 4 +- docs/manuscripts/ds/图论/1.基本概念.md | 4 +- docs/manuscripts/ds/图论/2.图的存储.md | 4 +- docs/manuscripts/ds/图论/3.图的遍历.md | 4 +- docs/manuscripts/ds/图论/4.图的应用.md | 4 +- docs/manuscripts/ds/图论/5.总结.md | 4 +- docs/manuscripts/ds/排序/1.基本概念.md | 4 +- docs/manuscripts/ds/排序/2.插入排序.md | 4 +- docs/manuscripts/ds/排序/3.交换排序.md | 4 +- docs/manuscripts/ds/排序/4.选择排序.md | 4 +- docs/manuscripts/ds/排序/5.归并排序.md | 4 +- docs/manuscripts/ds/排序/6.基数排序.md | 4 +- docs/manuscripts/ds/排序/7.外部排序.md | 4 +- docs/manuscripts/ds/排序/8.总结.md | 4 +- docs/manuscripts/ds/查找/1.基本概念.md | 4 +- docs/manuscripts/ds/查找/2.顺序查找.md | 4 +- docs/manuscripts/ds/查找/3.折半查找.md | 4 +- docs/manuscripts/ds/查找/4.B树和B+树.md | 4 +- docs/manuscripts/ds/查找/5.散列表.md | 4 +- docs/manuscripts/ds/查找/6.总结.md | 4 +- .../ds/栈和队列/1.栈的基本概念和基本操作.md | 14 +- .../ds/栈和队列/2.栈的顺序存储结构.md | 33 +- .../ds/栈和队列/3.栈的链式存储结构.md | 21 +- .../ds/栈和队列/4.队列的基本概念和操作.md | 10 +- .../ds/栈和队列/5.队列的顺序存储结构.md | 47 +- .../ds/栈和队列/6.队列的链式存储结构.md | 17 +- .../manuscripts/ds/栈和队列/7.栈VS队列补充.md | 41 +- docs/manuscripts/ds/栈和队列/readme.md | 2 +- docs/manuscripts/ds/树和二叉树/1.基本概念.md | 4 +- docs/manuscripts/ds/树和二叉树/2.二叉树.md | 4 +- .../ds/树和二叉树/3.二叉树的遍历.md | 4 +- .../manuscripts/ds/树和二叉树/4.线索二叉树.md | 4 +- docs/manuscripts/ds/树和二叉树/5.树和森林.md | 4 +- docs/manuscripts/ds/树和二叉树/6.树的应用.md | 4 +- docs/manuscripts/ds/树和二叉树/7.总结.md | 4 +- docs/manuscripts/mark-map/ccp-map.md | 2 - docs/manuscripts/mark-map/cn-map.md | 2 +- docs/manuscripts/mark-map/ds-map.md | 1750 ++++++++--------- docs/manuscripts/mark-map/os-map.md | 2 - docs/manuscripts/mark-map/readme.md | 3 - docs/manuscripts/os/readme.md | 7 - docs/manuscripts/os/内存管理/1.引论.md | 4 +- docs/manuscripts/os/内存管理/2.虚拟内存.md | 4 +- docs/manuscripts/os/内存管理/3.一些总结.md | 4 +- docs/manuscripts/os/文件管理/1.基本概念.md | 4 +- docs/manuscripts/os/文件管理/2.文件系统.md | 4 +- docs/manuscripts/os/文件管理/3.磁盘管理.md | 4 +- docs/manuscripts/os/文件管理/4.一些总结.md | 4 +- .../manuscripts/os/系统概述/1.操作系统引论.md | 14 +- docs/manuscripts/os/系统概述/2.发展和分类.md | 4 +- docs/manuscripts/os/系统概述/3.运行环境.md | 4 +- docs/manuscripts/os/系统概述/4.体系结构.md | 4 +- .../os/输入、输出管理/1.基本概述.md | 4 +- .../os/输入、输出管理/2.核心子系统.md | 4 +- .../os/输入、输出管理/3.高速缓存和缓冲区.md | 4 +- .../os/输入、输出管理/4.一些总结.md | 4 +- docs/manuscripts/os/进程管理/1.进程和线程.md | 4 +- docs/manuscripts/os/进程管理/2.处理机调度.md | 4 +- docs/manuscripts/os/进程管理/3.进程同步.md | 4 +- docs/manuscripts/os/进程管理/4.死锁.md | 4 +- docs/manuscripts/os/进程管理/5.一些总结.md | 4 +- docs/manuscripts/readme.md | 2 +- docs/quick-start.md | 21 +- docs/readme.md | 26 +- docs/wechat-list.md | 125 +- package.json | 1 + pnpm-lock.yaml | 126 ++ scripts/lint | 13 +- 123 files changed, 1452 insertions(+), 1695 deletions(-) create mode 100644 .markdownignore create mode 100644 .markdownlint.js diff --git a/.markdownignore b/.markdownignore new file mode 100644 index 0000000..a472ff0 --- /dev/null +++ b/.markdownignore @@ -0,0 +1,3 @@ +**/node_modules/** +CHANGELOG.md +LICENSE diff --git a/.markdownlint.js b/.markdownlint.js new file mode 100644 index 0000000..f3599b9 --- /dev/null +++ b/.markdownlint.js @@ -0,0 +1,68 @@ +module.exports = { + "default": true, + "MD001": false, + "MD003": { + "style": "atx" + }, + "MD004": { + "style": "dash" + }, + "MD013": false, + "MD024": { + "allow_different_nesting": true + }, + "MD033": { + "allowed_elements": [ + "br", + "template", + "script", + "style", + "ArtPlayer", + "AudioPlayer", + "AutoCatalog", + "Badge", + "BiliBili", + "Catalog", + "CodePen", + "DemoProject", + "FontIcon", + "HighlightPanel", + "ProjectLink", + "PDF", + "Replit", + "Share", + "SiteInfo", + "StackBlitz", + "XiGua", + "VidStack", + "VideoPlayer", + "YouTube", + "AppearanceSwitch", + "HopeIcon", + "FlowChartPlayground", + "IconDisplay", + "KatexPlayground", + "PrintButton", + "ThemeColorPicker", + "ToggleFullScreenButton", + "ToggleRTLButton", + "div", + "a", + "p", + "img", + "table", + "strong", + "sub" + ] + }, + "MD035": { + "style": "---" + }, + "MD036": false, + "MD040": false, + "MD045": false, + "MD041": false, + "MD042": false, + "MD046": false, + "MD049": false +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e01da30..506679f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,96 +6,82 @@ All notable changes to this project will be documented in this file. See [Conven ## [0.0.1-alpha.6](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.5...v0.0.1-alpha.6) (2023-10-15) - ### Features -* 修改侧边栏内容,大幅增加md初始文档 ([#61](https://github.com/142vip/408CSFamily/issues/61)) ([fe3dedb](https://github.com/142vip/408CSFamily/commit/fe3dedbc35068a8498ea106e944f963488bfb3c5)) -* 删除栈、队列备份文件,优化数据结构文档 ([2d47327](https://github.com/142vip/408CSFamily/commit/2d473270cc5924d5333200f759e7ec212ee4e43f)) -* 集成xmind,支持思维导图在线预览 ([3ff248b](https://github.com/142vip/408CSFamily/commit/3ff248b2cdb08313dbaae70eb9665dc9e4b529c1)) - +- 修改侧边栏内容,大幅增加md初始文档 ([#61](https://github.com/142vip/408CSFamily/issues/61)) ([fe3dedb](https://github.com/142vip/408CSFamily/commit/fe3dedbc35068a8498ea106e944f963488bfb3c5)) +- 删除栈、队列备份文件,优化数据结构文档 ([2d47327](https://github.com/142vip/408CSFamily/commit/2d473270cc5924d5333200f759e7ec212ee4e43f)) +- 集成xmind,支持思维导图在线预览 ([3ff248b](https://github.com/142vip/408CSFamily/commit/3ff248b2cdb08313dbaae70eb9665dc9e4b529c1)) ### Bug Fixes -* 修复release变更记录异常 ([452e9ea](https://github.com/142vip/408CSFamily/commit/452e9ead6d7a61d0add18235f81011cf7decdf88)) -* 修复xmind文件使用viewer依赖构建异常,配置自定义组件只客户端渲染 ([229ae8e](https://github.com/142vip/408CSFamily/commit/229ae8e41c8540e0b5e1297ac0d19907997f5209)) -* 修复思维导图显示链接跳转异常 ([b68ade5](https://github.com/142vip/408CSFamily/commit/b68ade5005e89861172c9be1b0e5a9b5a741e464)) - +- 修复release变更记录异常 ([452e9ea](https://github.com/142vip/408CSFamily/commit/452e9ead6d7a61d0add18235f81011cf7decdf88)) +- 修复xmind文件使用viewer依赖构建异常,配置自定义组件只客户端渲染 ([229ae8e](https://github.com/142vip/408CSFamily/commit/229ae8e41c8540e0b5e1297ac0d19907997f5209)) +- 修复思维导图显示链接跳转异常 ([b68ade5](https://github.com/142vip/408CSFamily/commit/b68ade5005e89861172c9be1b0e5a9b5a741e464)) ### Performance Improvements -* vuepress及主题相关依赖同步最新 ([aa6a54f](https://github.com/142vip/408CSFamily/commit/aa6a54f5a9ec1f4c3313350275415b983c7d84ee)) +- vuepress及主题相关依赖同步最新 ([aa6a54f](https://github.com/142vip/408CSFamily/commit/aa6a54f5a9ec1f4c3313350275415b983c7d84ee)) ## [0.0.1-alpha.5](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.4...v0.0.1-alpha.5) (2023-10-10) - ### Features -* 优化流水线缓存 ([#55](https://github.com/142vip/408CSFamily/issues/55)) ([dadfea4](https://github.com/142vip/408CSFamily/commit/dadfea48ce9da2632044bb75a186cb774fcbd805)) -* 关闭博客功能,加入插件依赖,支持md文档拓展 ([9d24d49](https://github.com/142vip/408CSFamily/commit/9d24d49669768fe0c40f1362ef06110e6fd14f68)) -* 新增markdown转思维导图脚本,导航栏改版 ([67cee8c](https://github.com/142vip/408CSFamily/commit/67cee8cbc70ba030e47f2b2a4b3299e760468d49)) -* 新增操作系统、数据结构笔记文档 ([6962e3d](https://github.com/142vip/408CSFamily/commit/6962e3d48be173733c818cbc69302a338659d03c)) -* 更新思维导图,优化侧边栏快速预览 ([af23b81](https://github.com/142vip/408CSFamily/commit/af23b81246144f545e337f83cfa2bed65dfe6daf)) -* 绘制部分思维导图 ([d084c7c](https://github.com/142vip/408CSFamily/commit/d084c7c12d1a62bcf685cc54a23a28d3cdb4abf8)) - +- 优化流水线缓存 ([#55](https://github.com/142vip/408CSFamily/issues/55)) ([dadfea4](https://github.com/142vip/408CSFamily/commit/dadfea48ce9da2632044bb75a186cb774fcbd805)) +- 关闭博客功能,加入插件依赖,支持md文档拓展 ([9d24d49](https://github.com/142vip/408CSFamily/commit/9d24d49669768fe0c40f1362ef06110e6fd14f68)) +- 新增markdown转思维导图脚本,导航栏改版 ([67cee8c](https://github.com/142vip/408CSFamily/commit/67cee8cbc70ba030e47f2b2a4b3299e760468d49)) +- 新增操作系统、数据结构笔记文档 ([6962e3d](https://github.com/142vip/408CSFamily/commit/6962e3d48be173733c818cbc69302a338659d03c)) +- 更新思维导图,优化侧边栏快速预览 ([af23b81](https://github.com/142vip/408CSFamily/commit/af23b81246144f545e337f83cfa2bed65dfe6daf)) +- 绘制部分思维导图 ([d084c7c](https://github.com/142vip/408CSFamily/commit/d084c7c12d1a62bcf685cc54a23a28d3cdb4abf8)) ### Bug Fixes -* 修复CD流水线vercel发布异常 ([384a752](https://github.com/142vip/408CSFamily/commit/384a7524744f4605487d3c2d4ded2e1bef6ae03d)) - +- 修复CD流水线vercel发布异常 ([384a752](https://github.com/142vip/408CSFamily/commit/384a7524744f4605487d3c2d4ded2e1bef6ae03d)) ### Performance Improvements -* 修改CI代码拉取策略,简化scripts脚本命令 ([#54](https://github.com/142vip/408CSFamily/issues/54)) ([5e1aedb](https://github.com/142vip/408CSFamily/commit/5e1aedbd463fcd265c8641270ae65429481fb1d1)) +- 修改CI代码拉取策略,简化scripts脚本命令 ([#54](https://github.com/142vip/408CSFamily/issues/54)) ([5e1aedb](https://github.com/142vip/408CSFamily/commit/5e1aedbd463fcd265c8641270ae65429481fb1d1)) ## [0.0.1-alpha.4](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.3...v0.0.1-alpha.4) (2023-09-28) - ### Features -* 新增一些文档 ([0d947c7](https://github.com/142vip/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206)) -* 新增scripts脚本说明 ([32d42f7](https://github.com/142vip/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4)) - +- 新增一些文档 ([0d947c7](https://github.com/142vip/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206)) +- 新增scripts脚本说明 ([32d42f7](https://github.com/142vip/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4)) ### Bug Fixes -* 修复Github Release异常 ([c3de0ba](https://github.com/142vip/408CSFamily/commit/c3de0bae093237e870fa8e534e69c219ddd02301)) - +- 修复Github Release异常 ([c3de0ba](https://github.com/142vip/408CSFamily/commit/c3de0bae093237e870fa8e534e69c219ddd02301)) ## [0.0.1-alpha.3](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.2...v0.0.1-alpha.3) (2023-09-28) - ### Bug Fixes -* 修复持续交付vercel异常 ([57473e5](https://github.com/142vip/408CSFamily/commit/57473e5e491a0133a2b5494c3b9e7e65b990dd23)) +- 修复持续交付vercel异常 ([57473e5](https://github.com/142vip/408CSFamily/commit/57473e5e491a0133a2b5494c3b9e7e65b990dd23)) ## [0.0.1-alpha.2](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.1...v0.0.1-alpha.2) (2023-09-28) - ### Bug Fixes -* 修复release CD异常 ([7ce3714](https://github.com/142vip/408CSFamily/commit/7ce3714f9bcfbcad40ef9df462a343b37742273a)) - +- 修复release CD异常 ([7ce3714](https://github.com/142vip/408CSFamily/commit/7ce3714f9bcfbcad40ef9df462a343b37742273a)) ### Performance Improvements -* 升级依赖版本,支持锁定node18.18 ([a1dfbaf](https://github.com/142vip/408CSFamily/commit/a1dfbaf1d3c22ff5844d5c976e24b35d2578a62e)) +- 升级依赖版本,支持锁定node18.18 ([a1dfbaf](https://github.com/142vip/408CSFamily/commit/a1dfbaf1d3c22ff5844d5c976e24b35d2578a62e)) ## [0.0.1-alpha.1](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.0...v0.0.1-alpha.1) (2023-09-08) - ### Features -* 优化脚本 ([e3d5fba](https://github.com/142vip/408CSFamily/commit/e3d5fbad7814d0cb652484e0eb5acbdcbe2d940b)) -* 修正脚本异常 ([c003e11](https://github.com/142vip/408CSFamily/commit/c003e11b8044bfdf1ff7151f04f9c03fea777095)) -* 文档更新 ([0d947c7](https://github.com/142vip/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206)) -* 新增release发布脚本 ([d94f30a](https://github.com/142vip/408CSFamily/commit/d94f30aa20063cd1c8bd9b08f63acf484fe2e698)) -* 新增scripts脚本说明 ([32d42f7](https://github.com/142vip/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4)) -* 新增vercel部署ci ([bc59fea](https://github.com/142vip/408CSFamily/commit/bc59fea739b0e20497ac86daf06a2bdbb11f8cf5)) -* 脚本优化更新 ([c072b3d](https://github.com/142vip/408CSFamily/commit/c072b3d3a4ae70d542a59b52babb1d67b4102230)) - +- 优化脚本 ([e3d5fba](https://github.com/142vip/408CSFamily/commit/e3d5fbad7814d0cb652484e0eb5acbdcbe2d940b)) +- 修正脚本异常 ([c003e11](https://github.com/142vip/408CSFamily/commit/c003e11b8044bfdf1ff7151f04f9c03fea777095)) +- 文档更新 ([0d947c7](https://github.com/142vip/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206)) +- 新增release发布脚本 ([d94f30a](https://github.com/142vip/408CSFamily/commit/d94f30aa20063cd1c8bd9b08f63acf484fe2e698)) +- 新增scripts脚本说明 ([32d42f7](https://github.com/142vip/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4)) +- 新增vercel部署ci ([bc59fea](https://github.com/142vip/408CSFamily/commit/bc59fea739b0e20497ac86daf06a2bdbb11f8cf5)) +- 脚本优化更新 ([c072b3d](https://github.com/142vip/408CSFamily/commit/c072b3d3a4ae70d542a59b52babb1d67b4102230)) ### Bug Fixes -* 修复CI/CD流水线异常 ([edf222f](https://github.com/142vip/408CSFamily/commit/edf222f297dbe57782f46fd6d38dd7c92d59e3fe)) +- 修复CI/CD流水线异常 ([edf222f](https://github.com/142vip/408CSFamily/commit/edf222f297dbe57782f46fd6d38dd7c92d59e3fe)) \ No newline at end of file diff --git a/README.md b/README.md index 0bdb84d..1b6fb64 100644 --- a/README.md +++ b/README.md @@ -6,48 +6,38 @@ -
-
- - 作者: 储凡 - -
-
- - Netlify - - - Vercel - -
-
- code size - tag version - release version - repo size -
+
+ + 作者: 储凡 + +
+
+ + Netlify + + + Vercel + +
+
+ code size + tag version + release version + repo size +
- - - - - - ### 在线浏览 - 稳定版: - > 网站无法访问时,建议通过科学上网访问备用网络 - Github: - Netlify: - Vercel: - - ## 写最前面 `408CSFamily` 我的理解是:408计算机专业课”全家桶“,而408相信考研er都知道计算机考研专业课代码;在最新的高校计算机研究生招考中,已经越来越多的学校改考408。可见408所涉及到的专业课举足轻重的地位;不论是在考研或者找工作,我相信408的专业基础必定是难以避免的,所以话不多说、形势复杂,唯一能做的就是不停的学习、巩固基础知识,加油! @@ -59,10 +49,6 @@ 1. 长期更新、维护 2. 建议结合思维导图进行学习 - - - - ### 思维导图【MD文档版本】 > 主要是关键知识,更新优化中... @@ -72,39 +58,29 @@ - 操作系统(TBD) - 计算机网络(TBD) - ## 电子书PDF ### 王道 +- 数据结构2019: 密码: euja -- 数据结构2019: https://pan.baidu.com/s/18x8AIfOkZxz197eY7HLRMg 密码: euja - -- 计算机组成原理2019: https://pan.baidu.com/s/1DiOBJMt9ZnZ6GK4CRCETJg 密码: wic5 - -- 计算机网络2019: https://pan.baidu.com/s/1mmIZDugwY5YyytzIJoGQFw 密码: dpkb - -- 操作系统2019: https://pan.baidu.com/s/1gzuUqq09xqi8wQ8JJRF69g 密码: o9b3 - +- 计算机组成原理2019: 密码: wic5 +- 计算机网络2019: 密码: dpkb +- 操作系统2019: 密码: o9b3 ## 学习视频 > 不是王道工作人员,不做任何推销,只是感觉看书不太行的话还是得找找视频辅助下,就发现了王道视频。 > 唯一要推销的可能是我的B站:**[Rong姐姐好可爱](https://space.bilibili.com/350937042)** -> +> > 补充:视频都是王道官方的,我自己有时也会用这个,如果链接失效可以去B站搜搜哈 - - - -- [数据结构](https://www.bilibili.com/video/BV1b7411N798) -- [计算机组成原理](https://www.bilibili.com/video/BV1BE411D7ii) -- [操作系统](https://www.bilibili.com/video/BV1YE411D7nH) -- [计算机网络](https://www.bilibili.com/video/BV19E411D78Q) - - +- [数据结构](https://www.bilibili.com/video/BV1b7411N798) +- [计算机组成原理](https://www.bilibili.com/video/BV1BE411D7ii) +- [操作系统](https://www.bilibili.com/video/BV1YE411D7nH) +- [计算机网络](https://www.bilibili.com/video/BV19E411D78Q) ## 大纲目录(善用Ctrl+F) @@ -113,6 +89,7 @@ ### 数据结构 > 参考资料 +> > - 《数据结构》 . > - 《大话数据结构》. > - 《数据结构与算法景点问题解析》 第二版 Narasimha Karumanchi著. @@ -136,7 +113,6 @@ - [存储结构的选取](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485549&idx=1&sn=4b7091696c40874a7dcfc682ca18db61&chksm=fcdfb1e1cba838f7e611341fe3b6f3c45fc6efcdce18e79be244a349c87a8e6abcbbd33c250c&token=1697862929&lang=zh_CN#rd) - [零碎知识补充](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485549&idx=2&sn=5282cd006b6c33e4bfe992298602e053&chksm=fcdfb1e1cba838f743a335bad530cf415eef57a417b807257d8ed6983047c2d57d5552b34cb0&token=1697862929&lang=zh_CN#rd) - #### 栈 - 基本概念和操作 @@ -164,7 +140,6 @@ - 树和森林 - 树的应用 - #### 图论 - 基本概念 @@ -172,7 +147,6 @@ - 图的遍历 - 图的应用 - #### 查找 - 基本概念 @@ -191,10 +165,10 @@ - 基数排序 - 外部排序 - ### 计算机操作系统 > 参考资料 +> > - 《计算机操作系统》 第四版 汤小丹、梁红兵、汤子瀛著 > - 《操作系统-王道考研》 2019 王道论坛 @@ -207,13 +181,11 @@ #### 进程管理 - - 进程和线程 - 处理机调度 - 进程同步 - 死锁 - #### 内存管理 - 引论 @@ -227,7 +199,6 @@ - 磁盘管理 - 一些总结 - #### 输入、输出管理 - 基本概述 @@ -235,14 +206,13 @@ - 高速缓存和缓冲区 - 一些总结 - ### 计算机组成原理 > 参考资料 +> > - 《计算机组成原理》 第二版 唐朔飞 > - 《计算机组成原理-王道考研》 2019 王道论坛 - #### 概述 #### 数据的表示和运算 @@ -253,26 +223,22 @@ #### 中央处理器 - #### 总线 - #### 输入输出系统 - ### 计算机网络 > 参考资料 +> > - 《计算机网络-第七版》 谢希仁著. > - 《计算机网络-王道考研》 2019 王道论坛. - #### 体系机构 - 基本介绍 - 体系结构与参考模型 - #### 物理层 - 通信基础 @@ -306,7 +272,6 @@ - UDP协议 - TCP协议 - #### 应用层 - 应用模型 @@ -315,33 +280,23 @@ - 电子邮件 - HTTP协议 - - - ## 赞赏列表 以下排名不分先后! [传送门→]() **赞赏过的一定要微信跟我说呀!!!!!!** - - - ## 赞助商 **以下排名不分先后! 还木有收到赞助,哈哈哈,先留坑** - - - - ## 贡献 感谢向仓库提交mr的所有开发者 @@ -354,7 +309,6 @@ Star History - ## 联系作者 若系列文章对你有所帮助,欢迎订阅公众号或微信”骚扰“,获取更多内容。**商务合作请备注来意** @@ -362,13 +316,13 @@
- 关注公众号联系作者
@@ -424,8 +378,3 @@ 交流/加群/互看朋友圈 当然:**聊天 /提问 /建议 /提需求** 可以在本公众号直接**私信**,后台可以看到,有时间即会回复,偶尔的延迟和疏漏还请小伙伴们谅解,蟹蟹。 - - - - - diff --git a/docs/big-event-history.md b/docs/big-event-history.md index 7561cc6..0d4b2f9 100644 --- a/docs/big-event-history.md +++ b/docs/big-event-history.md @@ -1,14 +1,12 @@ # 大事记 - > 有时间再梳理梳理吧.... - -### 2020.6.22 +### 2020.6.22 - 第一次Github提交,开源 ### 2020.4.8 -- 武汉疫情解封 -- 项目成立,取名`408CSFamily` \ No newline at end of file +- 武汉疫情解封 +- 项目成立,取名`408CSFamily` diff --git a/docs/changelog.md b/docs/changelog.md index 0531d4b..df4052d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,7 +2,6 @@ 该文件包含 `408CSFamily` 仓库和网站所有显着更改。 - ## 更多 @@ -12,4 +11,3 @@ 对于发布早于 0.0.1-alpha.1 的历史版本,详见[Github 仓库](https://github.com/142vip/408CSFamily/blob/master/CHANGELOG.md) 。 ::: - diff --git a/docs/job-poster-bytedance.md b/docs/job-poster-bytedance.md index 9be5241..4d7b322 100644 --- a/docs/job-poster-bytedance.md +++ b/docs/job-poster-bytedance.md @@ -20,20 +20,21 @@ ``` - **帮朋友转发、宣传一下,JD是相对社招而言,校招、实习会降低要求!社招、校招、实习机会多多,更有漂亮hr小姐姐引导整个流程; -不论是在校学生还是已步入职场的你,只要有兴趣,觉得合适的给我简历安排内推;欢迎简历骚扰,备注来意即可:mmdapl@163.com** - +不论是在校学生还是已步入职场的你,只要有兴趣,觉得合适的给我简历安排内推;欢迎简历骚扰,备注来意即可:** #### 资深前端开发工程师 - 抖音电商 ##### 职位描述 + - 负责字节跳动电商C端业务产品(抖音、西瓜、头条、番茄小说、皮皮虾等应用)的工程架构设计、业务开发、跨端架构设计,覆盖Web应用、多端组件库、C端搭建等多个方向; - 参与团队前端工程化体系建设,逐步提升研发效率、研发质量,通过前端技术的不断产出驱动业务的发展; - 与产品经理、设计师、后端工程师一起,提升产品的用户体验,打造卓越的互联网产品; - 关注前端前沿技术发展,能够将新知识传递给团队,并且转化到潜在项目中。 + ##### 职位要求 + - 扎实的计算机基础知识,熟悉常用的数据结构、算法和设计模式,并能在日常研发中灵活使用; - 深入理解Web前端开发技术,包括HTML/CSS/JavaScript等; - 掌握至少一种主流前端框架,包括React/vue等,有实际项目研发经验; @@ -42,17 +43,18 @@ - 熟悉交互设计理论,能够将优秀的交互设计落地到产品中,能够独立完成一个复杂模块或项目的研发工作; - 具备较强的责任感、团队合作精神、逻辑思维能力和表达能力。 - - #### 高级前端研发工程师-抖音短视频 ##### 职位描述 + - 负责抖音相关产品功能开发,包括用户产品端功能、大型活动、小程序等的开发; - 负责抖音相关中台、业务平台、ToB产品的全栈技术方案设计、开发; - 负责基础框架、工具链、组件库等基础设施设计、开发和维护; - 在跨端及全栈、音视频等技术方向进行核心难题攻坚; - 基于跨端和全栈技术探索高效开发迭代模式。 + ##### 职位要求 + - 本科及以上学历,扎实的计算机基础和前端基础; - 熟练掌握React/Vue等大型前端框架,理解底层原理,能够灵活运用; - 了解跨客户端/全栈 其中的一种技术体系,理解相关底层原理; @@ -61,15 +63,15 @@ - 有跨端开发经验(React Native/Weex/Flutter)加分; - 有Web游戏开发或引擎开发,音视频相关实践经验加分。 - - - #### 高级前端研发工程师 - 翻译平台 ##### 职位描述 + - 负责国际化文案管理及翻译平台的迭代,促进公司内外部各产品的国际化发展; - 负责国际化多语言工具链建设,提升国际化开发、翻译的效率。 + ##### 职位要求 + - 本科及以上学历,2 年及以上工作经验,计算机相关专业优先; - 熟悉React、Redux/Mobx技术栈以及Webpack等打包构建工具,具备较强的项目架构能力; - 对设计原理有一定研究,有良好的代码设计意识; @@ -77,40 +79,45 @@ - 有国际化产品背景加分; - 有i18n相关方案开发或者维护经验的加分。 - - #### 高级前端开发工程师 - 中后台方向 ##### 职位描述 + - 参与IES企业级设计体系『Semi Design』开发及维护,包括UI组件库、主题平台、物料平台等; - 参与IES中后台设计开发工具链开发及维护,包括主题/物料开发工具、Sketch/Figma插件、IDE插件等; - 参与IES中后台基础库、解决方案开发及维护,包括i18n、权限、路由等方案; - 参与前沿设计智能的研究。 + ##### 职位要求 + - 三年以上前端相关工作经验,计算机及相关专业; - 对React相关技术栈有深入研究,了解Vue相关技术栈; - 熟悉Webpack等打包构建工具; - 有丰富的中后台开发经验,具备一定的服务端开发基础,熟悉;Koa/Express开发,熟悉运维部署。 - #### 高级前端研发工程师-抖音用户增长-激励体系方向 + ##### 职位描述 + - 负责抖音端内金币激励产品迭代; - 负责抖音端内增长游戏产品迭代。 + ##### 职位要求 + - 本科及以上学历,计算机基础扎实,熟练掌握Javascript/CSS; - 掌握当前流行的前端框架,如React/Vue,并熟悉其衍生生态,如Redux、Webpack等; - 有跨端开发经验,有RN/Weex/小程序/Flutter等项目经验; - 对小游戏玩法有强烈兴趣,对游戏引擎有一定认知,如 Cocos2d,Layabox,Egret 等。 - - #### 前端开发工程师-直播方向 ##### 职位描述 + - 负责抖音/抖音火山版/西瓜视频/今日头条等产品直播研发,webapp/hybrid/React Native/小程序/Electron/多媒体,以及大型中后台大前端研发; - 追求极致,不停探索前端跨平台技术。 + ##### 职位要求 + - 计算机基础扎实,熟练掌握Javascript,ES5/6,CSS,熟练掌握各种布局; - 对解决 CSS/JS 多浏览器兼容性问题,前端性能优化有一定的经验; - 理解工程化思想,对构建和持续集成有一定认识,熟悉一种构建工具; @@ -120,32 +127,35 @@ - 对大型网站重构有丰富经验者优先,有成功作品者优先; - 对动画渲染引擎有经验者优先。 - - #### 前端开发工程师-支付 ##### 团队介绍 依托字节跳动强大的业务中台和技术中台能力,快速探索互联网全新的业务形态,寻找全新的用户需求,创造全新的业务场景,服务数亿用户。 + ##### 职位描述 - 自我驱动完成核心业务系统的前端研发工作; - 优化前端体验,解决性能和交互难点; - 参与前端工具链、通用服务、基础库、设计语言建设。 + ##### 职位要求 + - 本科及以上学历,计算机相关专业优先; - 理解并熟练掌握 HTML(5)、CSS(3)、JS,拥有成熟应用经验; - 熟练前端生态并怀有兴趣和好奇心,至少熟悉一种主流框架; - 学习能力强,对产品有强烈的责任感,拥有沟通和团队协作能力,适应自驱工作环境 。 - #### 前端研发工程师-智能营销中台 ##### 职位描述 + - 负责设计稿智能解析生成UI界面平台开发; - 负责智能设计辅助平台开发; - 负责公司运营活动平台建设。 + ##### 职位要求 + - 计算机、通信和电子信息科学相关专业优先; - 有图像算法、深度学习背景优先; - 熟悉前端相关技术,包括HTML、CSS、JavaScript等; @@ -155,9 +165,12 @@ #### 前端开发工程师-社区安全方向 ##### 职位描述 + - 负责抖音端内社区安全和隐私合规相关功能的前端开发工作; - 负责抖音社区安全、隐私合规方向的平台建设工作。 + ##### 职位要求 + - 计算机基础扎实,熟悉常用的数据结构和算法,具备扎实的编码能力; - 前端基础扎实,熟练掌握HTML、Javascript、CSS及HTTP协议; - 熟悉至少一种Web开发框架,如React、Vue、Angular等; diff --git a/docs/manuscripts/ccp/readme.md b/docs/manuscripts/ccp/readme.md index bea9ef3..ef7ac5a 100644 --- a/docs/manuscripts/ccp/readme.md +++ b/docs/manuscripts/ccp/readme.md @@ -1,7 +1,5 @@ # 计算机组成原理 - - ### 引论 ### 数据的表示和运算 @@ -15,4 +13,3 @@ ### 总线 ### 输入/输出系统 - diff --git a/docs/manuscripts/cn/readme.md b/docs/manuscripts/cn/readme.md index 7c9d6e0..3c53cc0 100644 --- a/docs/manuscripts/cn/readme.md +++ b/docs/manuscripts/cn/readme.md @@ -16,7 +16,6 @@ root(计算机网络) - 基本介绍 - 体系结构与参考模型 - ## 物理层 - 通信基础 @@ -50,7 +49,6 @@ root(计算机网络) - UDP协议 - TCP协议 - ## 应用层 - 应用模型 @@ -62,4 +60,4 @@ root(计算机网络) ## 参考资料 -《计算机网络-第七版》谢希仁著. --《计算机网络-王道考研》2019 王道论坛. \ No newline at end of file +-《计算机网络-王道考研》2019 王道论坛. diff --git a/docs/manuscripts/cn/传输层/1.提供的服务.md b/docs/manuscripts/cn/传输层/1.提供的服务.md index 3db80e8..2cb7371 100644 --- a/docs/manuscripts/cn/传输层/1.提供的服务.md +++ b/docs/manuscripts/cn/传输层/1.提供的服务.md @@ -1,3 +1,3 @@ -# 提供的服务 +# 提供的服务 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/传输层/2.UDP协议.md b/docs/manuscripts/cn/传输层/2.UDP协议.md index fef7b59..cafc173 100644 --- a/docs/manuscripts/cn/传输层/2.UDP协议.md +++ b/docs/manuscripts/cn/传输层/2.UDP协议.md @@ -1,3 +1,3 @@ -# UDP协议 +# UDP协议 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/传输层/3.TCP协议.md b/docs/manuscripts/cn/传输层/3.TCP协议.md index aa53775..c570037 100644 --- a/docs/manuscripts/cn/传输层/3.TCP协议.md +++ b/docs/manuscripts/cn/传输层/3.TCP协议.md @@ -1,3 +1,3 @@ -# TCP协议 +# TCP协议 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/传输层/4.总结.md b/docs/manuscripts/cn/传输层/4.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/cn/传输层/4.总结.md +++ b/docs/manuscripts/cn/传输层/4.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/体系结构/1.引论.md b/docs/manuscripts/cn/体系结构/1.引论.md index ad34d9c..64a48ab 100644 --- a/docs/manuscripts/cn/体系结构/1.引论.md +++ b/docs/manuscripts/cn/体系结构/1.引论.md @@ -1,3 +1,3 @@ -# 基本介绍 +# 基本介绍 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/体系结构/2.体系结构与参考模型.md b/docs/manuscripts/cn/体系结构/2.体系结构与参考模型.md index 5a88eaa..99c54fd 100644 --- a/docs/manuscripts/cn/体系结构/2.体系结构与参考模型.md +++ b/docs/manuscripts/cn/体系结构/2.体系结构与参考模型.md @@ -1,3 +1,3 @@ -# 体系结构与参考模型 +# 体系结构与参考模型 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/应用层/1.应用模型.md b/docs/manuscripts/cn/应用层/1.应用模型.md index 80d6088..0ca1354 100644 --- a/docs/manuscripts/cn/应用层/1.应用模型.md +++ b/docs/manuscripts/cn/应用层/1.应用模型.md @@ -1,3 +1,3 @@ -# 应用模型 +# 应用模型 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/应用层/2.DNS.md b/docs/manuscripts/cn/应用层/2.DNS.md index 22149d4..a74ef11 100644 --- a/docs/manuscripts/cn/应用层/2.DNS.md +++ b/docs/manuscripts/cn/应用层/2.DNS.md @@ -1,3 +1,3 @@ -# DNS +# DNS -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/应用层/3.FTP.md b/docs/manuscripts/cn/应用层/3.FTP.md index b422b79..3cfe01a 100644 --- a/docs/manuscripts/cn/应用层/3.FTP.md +++ b/docs/manuscripts/cn/应用层/3.FTP.md @@ -1,3 +1,3 @@ -# FTP +# FTP -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/应用层/4.HTTP.md b/docs/manuscripts/cn/应用层/4.HTTP.md index d19e895..bc10bce 100644 --- a/docs/manuscripts/cn/应用层/4.HTTP.md +++ b/docs/manuscripts/cn/应用层/4.HTTP.md @@ -1,3 +1,3 @@ -# HTTP +# HTTP -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/应用层/4.电子邮件.md b/docs/manuscripts/cn/应用层/4.电子邮件.md index bb77087..bd8fd38 100644 --- a/docs/manuscripts/cn/应用层/4.电子邮件.md +++ b/docs/manuscripts/cn/应用层/4.电子邮件.md @@ -1,3 +1,3 @@ -# 电子邮件 +# 电子邮件 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/应用层/5.总结.md b/docs/manuscripts/cn/应用层/5.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/cn/应用层/5.总结.md +++ b/docs/manuscripts/cn/应用层/5.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/1.通信基础.md b/docs/manuscripts/cn/数据链路层/1.通信基础.md index b749ac5..98c0d03 100644 --- a/docs/manuscripts/cn/数据链路层/1.通信基础.md +++ b/docs/manuscripts/cn/数据链路层/1.通信基础.md @@ -1,3 +1,3 @@ -# 基本功能 +# 基本功能 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/2.组帧.md b/docs/manuscripts/cn/数据链路层/2.组帧.md index b0f2538..38f85fb 100644 --- a/docs/manuscripts/cn/数据链路层/2.组帧.md +++ b/docs/manuscripts/cn/数据链路层/2.组帧.md @@ -1,3 +1,3 @@ -# 组帧 +# 组帧 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/3.差错控制.md b/docs/manuscripts/cn/数据链路层/3.差错控制.md index c782e89..a1c4a45 100644 --- a/docs/manuscripts/cn/数据链路层/3.差错控制.md +++ b/docs/manuscripts/cn/数据链路层/3.差错控制.md @@ -1,3 +1,3 @@ -# 差错控制 +# 差错控制 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/4.流量控制&可靠传输.md b/docs/manuscripts/cn/数据链路层/4.流量控制&可靠传输.md index c08dda6..5dfd8af 100644 --- a/docs/manuscripts/cn/数据链路层/4.流量控制&可靠传输.md +++ b/docs/manuscripts/cn/数据链路层/4.流量控制&可靠传输.md @@ -1,3 +1,3 @@ -# 流量控制&可靠传输 +# 流量控制&可靠传输 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/5.介质访问控制.md b/docs/manuscripts/cn/数据链路层/5.介质访问控制.md index 5d72d28..d560f49 100644 --- a/docs/manuscripts/cn/数据链路层/5.介质访问控制.md +++ b/docs/manuscripts/cn/数据链路层/5.介质访问控制.md @@ -1,3 +1,3 @@ -# 介质访问控制 +# 介质访问控制 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/6.局域网.md b/docs/manuscripts/cn/数据链路层/6.局域网.md index af8d827..887d545 100644 --- a/docs/manuscripts/cn/数据链路层/6.局域网.md +++ b/docs/manuscripts/cn/数据链路层/6.局域网.md @@ -1,3 +1,3 @@ -# 局域网 +# 局域网 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/7.广域网.md b/docs/manuscripts/cn/数据链路层/7.广域网.md index fa708e1..1ccd046 100644 --- a/docs/manuscripts/cn/数据链路层/7.广域网.md +++ b/docs/manuscripts/cn/数据链路层/7.广域网.md @@ -1,3 +1,3 @@ -# 广域网 +# 广域网 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/7.通信设备.md b/docs/manuscripts/cn/数据链路层/7.通信设备.md index 539eda3..60233fe 100644 --- a/docs/manuscripts/cn/数据链路层/7.通信设备.md +++ b/docs/manuscripts/cn/数据链路层/7.通信设备.md @@ -1,3 +1,3 @@ -# 通信设备 +# 通信设备 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/数据链路层/8.总结.md b/docs/manuscripts/cn/数据链路层/8.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/cn/数据链路层/8.总结.md +++ b/docs/manuscripts/cn/数据链路层/8.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/物理层/1.通信基础.md b/docs/manuscripts/cn/物理层/1.通信基础.md index 6468819..d141055 100644 --- a/docs/manuscripts/cn/物理层/1.通信基础.md +++ b/docs/manuscripts/cn/物理层/1.通信基础.md @@ -1,3 +1,3 @@ -# 通信基础 +# 通信基础 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/物理层/2.传输介质.md b/docs/manuscripts/cn/物理层/2.传输介质.md index a71e8b3..7c96127 100644 --- a/docs/manuscripts/cn/物理层/2.传输介质.md +++ b/docs/manuscripts/cn/物理层/2.传输介质.md @@ -1,3 +1,3 @@ -# 传输介质 +# 传输介质 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/物理层/3.物理层设备.md b/docs/manuscripts/cn/物理层/3.物理层设备.md index 8107f14..29c634c 100644 --- a/docs/manuscripts/cn/物理层/3.物理层设备.md +++ b/docs/manuscripts/cn/物理层/3.物理层设备.md @@ -1,3 +1,3 @@ -# 物理层设备 +# 物理层设备 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/物理层/4.总结.md b/docs/manuscripts/cn/物理层/4.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/cn/物理层/4.总结.md +++ b/docs/manuscripts/cn/物理层/4.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/1.基本功能.md b/docs/manuscripts/cn/网络层/1.基本功能.md index b749ac5..98c0d03 100644 --- a/docs/manuscripts/cn/网络层/1.基本功能.md +++ b/docs/manuscripts/cn/网络层/1.基本功能.md @@ -1,3 +1,3 @@ -# 基本功能 +# 基本功能 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/2.路由算法.md b/docs/manuscripts/cn/网络层/2.路由算法.md index bd750a3..778ee60 100644 --- a/docs/manuscripts/cn/网络层/2.路由算法.md +++ b/docs/manuscripts/cn/网络层/2.路由算法.md @@ -1,3 +1,3 @@ -# 路由算法 +# 路由算法 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/3.路由协议.md b/docs/manuscripts/cn/网络层/3.路由协议.md index 8f70d45..bbeca55 100644 --- a/docs/manuscripts/cn/网络层/3.路由协议.md +++ b/docs/manuscripts/cn/网络层/3.路由协议.md @@ -1,3 +1,3 @@ -# 路由协议 +# 路由协议 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/4.IPV4.md b/docs/manuscripts/cn/网络层/4.IPV4.md index dc28c88..6900594 100644 --- a/docs/manuscripts/cn/网络层/4.IPV4.md +++ b/docs/manuscripts/cn/网络层/4.IPV4.md @@ -1,3 +1,3 @@ -# IPV4 +# IPV4 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/5.IPV6.md b/docs/manuscripts/cn/网络层/5.IPV6.md index 49c9041..2546ea8 100644 --- a/docs/manuscripts/cn/网络层/5.IPV6.md +++ b/docs/manuscripts/cn/网络层/5.IPV6.md @@ -1,3 +1,3 @@ -# IPV6 +# IPV6 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/6.IP组播&移动IP.md b/docs/manuscripts/cn/网络层/6.IP组播&移动IP.md index 774e2f0..39da3df 100644 --- a/docs/manuscripts/cn/网络层/6.IP组播&移动IP.md +++ b/docs/manuscripts/cn/网络层/6.IP组播&移动IP.md @@ -1,3 +1,3 @@ -# IP组播&移动IP +# IP组播&移动IP -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/7.网络层设备.md b/docs/manuscripts/cn/网络层/7.网络层设备.md index e28b8e5..8a5a7c9 100644 --- a/docs/manuscripts/cn/网络层/7.网络层设备.md +++ b/docs/manuscripts/cn/网络层/7.网络层设备.md @@ -1,3 +1,3 @@ -# 网络层设备 +# 网络层设备 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/cn/网络层/8.总结.md b/docs/manuscripts/cn/网络层/8.总结.md index 0e7e117..b78efa4 100644 --- a/docs/manuscripts/cn/网络层/8.总结.md +++ b/docs/manuscripts/cn/网络层/8.总结.md @@ -1,3 +1,3 @@ -# 一些总结 +# 一些总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/basic-introduction/1.basic_concepts.md b/docs/manuscripts/ds/basic-introduction/1.basic_concepts.md index 1c9fc56..2587839 100644 --- a/docs/manuscripts/ds/basic-introduction/1.basic_concepts.md +++ b/docs/manuscripts/ds/basic-introduction/1.basic_concepts.md @@ -18,16 +18,12 @@ root(基础概念) **数据的基本单位**,通常按照一个整数来进行考虑和处理。 - 特别注意:一个数据元素由若干个**数据项**组成,数据项是构成数组元素的最小单位,且不可分割。 - - ### 数据对象 具有**相同性质**的数据元素的**集合**,**是数据的子集** - ### 数据类型 值的集合和定义在此集合上一组操作的总称 @@ -36,8 +32,6 @@ root(基础概念) - 结构类型:可以分解成若干分量(成分)的数据类型; - **抽象数据类型**:抽象出具组织和其相关的操作; - - ### 抽象数据类型(ADT) > Tips: 可以结合高级语言中类对象封装来理解; @@ -50,23 +44,18 @@ ADT抽象数据类型名{ } ADT抽象数据类型名 ``` - - 一个数学模型以及定义在该模型上的一组操作。定义仅仅取决于它的一组逻辑操作。与计算机内部如何表示和实现是没有关系; **不论内部结构如何变化,只要其数学特性不变,就不会影响到外部的使用,实现了数据封装和信息隐藏** - 通常由(数据对象、数据关系、数据操作集)三元组来表示抽象数据类型; 抽象数据类型的主要作用是**数据封装和信息隐藏,让实现与使用相分离**。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节,从而使这些操作不会受到其他对象的影响。 抽象数据类型独立于运算的具体实现,使用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,实现了信息隐藏。 - ### 数据结构 - 首先明确:数据元素都不是孤立存在的。元素与元素之间存在着某种关系,这种相互之间的关系就是**结构**。 **数据结构是相互之间存在一种或者多种特定关系的数据元素的集合** @@ -78,4 +67,3 @@ ADT抽象数据类型名{ 数据的逻辑结构和存储结构是密不可分的。 **算法的设计取决于所选定的逻辑结构;算法的实现依赖于所采用的存储结构;** - diff --git a/docs/manuscripts/ds/basic-introduction/2.three_elements_of_data_structure.md b/docs/manuscripts/ds/basic-introduction/2.three_elements_of_data_structure.md index b69ed19..bfed8d0 100644 --- a/docs/manuscripts/ds/basic-introduction/2.three_elements_of_data_structure.md +++ b/docs/manuscripts/ds/basic-introduction/2.three_elements_of_data_structure.md @@ -1,7 +1,6 @@ # 数据结构三要素 - ```mindmap root(数据结构三要素) 逻辑结构 @@ -24,12 +23,10 @@ root(数据结构三要素) - 线性结构 - 非线性结构 - 线性表是典型的线性结构,衍生出的栈、队列、串、数组、广义表也都是线性结构; 非线性结构主要有:集合、树(一般树、二叉树)、图(有向图、无向图) - 特别注意: - `集合`:结构中的数据元素之间**除了“同属于一个集合”的关系外,别无其他关系。** @@ -37,15 +34,12 @@ root(数据结构三要素) - `树形结构`:结构中的数据元素之间**存在一对多的关系。** - `图状结构和网状结构`:结构中的数据元素之间**存在多对多的关系。** - - ### 存储(物理)结构 数据结构在计算机中的表示(映像)。包括数据`元素的表示`和`关系的表示`。 存储结构是逻辑结构用计算机语言实现的,依赖于计算机语言。 - 可以分为: - 顺序存储 @@ -71,19 +65,17 @@ root(数据结构三要素) 什么是内外部碎片? -> 参考资料:https://blog.csdn.net/qq_22238021/article/details/80209062 +> 参考资料: - 外部碎片:`还没有分配出去`(不属于任何进程),但是**由于大小而无法分配给申请内存空间的新进程的内存空闲块。** - 内部碎片:`已经被分配出去`(能明确指出属于哪个进程)的**内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。** - #### 链式存储 与顺序存储不同,**链式存储不要求逻辑上相邻的元素在物理位置上也相邻。** 借助指示元素存储地址的`指针`表示元素之间的逻辑关系。 - 优点: - 不会出现碎片现象 @@ -94,7 +86,6 @@ root(数据结构三要素) - 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习)。 - 链式存储,**只能实现`顺序存取`,不能实现`随机存取`(指针的遍历)** - #### 索引存储 存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的`索引表`。 @@ -105,7 +96,6 @@ root(数据结构三要素) - 检索快(就好比字典有了目录,查询就很快了) - 缺点: - 增加了索引表,占用较多的存储空间(典型的空间换时间策略) @@ -115,11 +105,9 @@ root(数据结构三要素) 根据元素的关键字直接通过散列(Hash)函数计算出元素的存储地址。 - 优点: -- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了) - +- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了) 缺点: @@ -127,7 +115,6 @@ root(数据结构三要素) - 会出现`散列冲突`(主要依赖与散列函数,散列函数不好就很容易出现散列冲突) - 出现`散列冲突`时,解决冲突就会增加时间和空间上的开销 - ### 数据的运算 数据上的运算包括:`运算的定义` 、`运算的实现` @@ -135,7 +122,4 @@ root(数据结构三要素) - `运算的定义`:针对逻辑结构,指出运算的功能 - `原酸的实现`:针对存储结构,指出运算的具体操作步骤 - - - -线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。 \ No newline at end of file +线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。 diff --git a/docs/manuscripts/ds/basic-introduction/3.algorithm_and_algorithm_evaluation.md b/docs/manuscripts/ds/basic-introduction/3.algorithm_and_algorithm_evaluation.md index 2f384a1..7d875a4 100644 --- a/docs/manuscripts/ds/basic-introduction/3.algorithm_and_algorithm_evaluation.md +++ b/docs/manuscripts/ds/basic-introduction/3.algorithm_and_algorithm_evaluation.md @@ -14,12 +14,10 @@ root(算法和算法评价) 空间复杂度 ``` - ### 算法 `算法` : 对特定问题求解步骤的一种描述,**是指令的有序集合**,每一条指令表示一个或多个操作。 - #### 重要特性 - `有穷性`:必须总是(对任何合法的输入值)在**执行有穷步后结束**,并且每一步都可**在有穷时间内完成** @@ -28,7 +26,6 @@ root(算法和算法评价) - `输入`:有零个或者多个输入,**输入取决于某个特定的对象的集合。** - `输出`:有一个或者多个输出,**输出是和输入有着某种特定关系的量(强调输出与输入的关系)** - > **算法是有穷的,但是程序不一定满足有穷性**,程序只是算法在计算机上的特定的实现, 例如:死循环 #### 算法的目标 @@ -40,10 +37,8 @@ root(算法和算法评价) - 健壮性:**在输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果**(在高级语言编程中,类似于强调封装方法的参数校验) - 效率与低存储量需求:**效率即算法执行的时间**,**存储量需求即算法那执行过程中所有要的最大存储空间**,这些与算法所解决问题的规模有关; - > Tips: 效率可以结合时间复杂度来理解,存储量需求可以结合空间复杂度理解; - ### 效率的度量 算法效率的度量是通过`时间复杂度`和`空间复杂度`来描述的; @@ -71,6 +66,7 @@ int test(n) { ``` + 在这个简单的函数里 - 当n<1的时候,例如:-2,就不需要循环,此时时间复杂度可以理解为T(1) @@ -80,13 +76,10 @@ int test(n) { > **算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入的数据的性质(例如:输入元素的初始状态)** - - - `最坏时间复杂度`:**最坏情况下**,算法的时间复杂度 - `平均时间复杂度`:**所有可能输入实例在同等概率出现的情况下**,算法的期望运行时间 - `最好时间复杂度`:**最好的情况下**,算法的时间复杂度 - 一般情况下,考虑最坏情况的时间复杂度(即:最坏时间复杂度),保证算法的运行时间不会更长(最糟糕我都能预料,难道还有更糟糕?????噗呲) #### 空间复杂度 @@ -95,13 +88,10 @@ int test(n) { > 渐进空间复杂度也被称为空间复杂度,记作:S(n)=O(g(n)) - **一个程序除了需要存储空间来存放本身所用的指令、常数、变量和输入数据外,也需要对数据进行操作的工作单元和存储一些实现计算所需要信息的辅助空间。** 当输入数据所占用的空间只取决于问题本身,和算法无关时,只需要去分析除了输入和程序之外的额外空间 - - 算法原地工作:算法所需要辅助空间是常量,记作S(1),例如: ```c @@ -113,4 +103,4 @@ int switchValue(a,b){ } ``` -在上面的函数中,只是通过临时变量temp来实现a和b的值交换,没有需要更多变量,因此可以简单理解函数的在`原地工作`,辅助空间是常量,记作S(1) \ No newline at end of file +在上面的函数中,只是通过临时变量temp来实现a和b的值交换,没有需要更多变量,因此可以简单理解函数的在`原地工作`,辅助空间是常量,记作S(1) diff --git a/docs/manuscripts/ds/basic-introduction/readme.md b/docs/manuscripts/ds/basic-introduction/readme.md index 3f50b9f..a42ead0 100644 --- a/docs/manuscripts/ds/basic-introduction/readme.md +++ b/docs/manuscripts/ds/basic-introduction/readme.md @@ -1,4 +1,3 @@ # 基础入门 - -![](./basic_introduction.png) \ No newline at end of file +![](./basic_introduction.png) diff --git a/docs/manuscripts/ds/linear-table/1.basic_concept_and_operation.md b/docs/manuscripts/ds/linear-table/1.basic_concept_and_operation.md index 8b2d5bb..cbf8e1b 100644 --- a/docs/manuscripts/ds/linear-table/1.basic_concept_and_operation.md +++ b/docs/manuscripts/ds/linear-table/1.basic_concept_and_operation.md @@ -2,7 +2,6 @@ > 强调线性表是一种逻辑结构,不是存储结构 - ```mindmap root(数据结构三要素) 逻辑结构 @@ -14,18 +13,15 @@ root(数据结构三要素) 数据的运算 ``` - ### 定义 线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。一般表示: L=(a1,a2,a3......an) 其中n可以理解为表长(线性表的长度),n=0时候,即表空 - - `表头元素`:线性表中唯一的“第一个”数据元素,例如a1 - `表尾元素`:线性表中唯一的“最后一个”数据元素,例如an - 重要逻辑特性: - 除表头元素外,线性表中每个元素有且仅有一个`直接前驱` @@ -39,11 +35,8 @@ L=(a1,a2,a3......an) 其中n可以 - 元素的**数据类型都相同**(强调相同数据类型),每个数据元素占用相同大小的存储空间 - 元素具有**抽象性**,仅仅讨论元素之间的逻辑关系,不需要去考虑元素究竟表示的什么内容 - > Tips: **线性表是一种逻辑结构**,表示元素之间一对一的相邻关系。**顺序表和链表则指的是存储结构** - - ### 基本操作 - `InitList(&L)`: **初始化表**。构造空的线性表 @@ -56,7 +49,4 @@ L=(a1,a2,a3......an) 其中n可以 - `Empty(L)`:**判空操作**。当表L为空,则返回true,否则返回false - `DestoryList(&L)`:**销毁操作**。将线性表销毁,释放线性表L所占用的内存空间(类似:释放内存) - 线性表是具有相同的数据类型的有限个数据元素组成的,**数据元素是由数据项组成的** - - diff --git a/docs/manuscripts/ds/linear-table/2.sequential_representation.md b/docs/manuscripts/ds/linear-table/2.sequential_representation.md index 9b0f6c3..3cd1ed8 100644 --- a/docs/manuscripts/ds/linear-table/2.sequential_representation.md +++ b/docs/manuscripts/ds/linear-table/2.sequential_representation.md @@ -1,6 +1,5 @@ # 线性表的顺序表示 - ```mindmap root(数据结构三要素) 逻辑结构 @@ -16,16 +15,9 @@ root(数据结构三要素) `顺序表`:顺序存储的线性表,**是用一组地址连续的存储单元,依次存储线性表中的数据元素,使得在逻辑上相邻的两个元素在物理位置上也相邻。** - - - - - 顺序表中的元素的逻辑顺序与实际的物理位置相同 - - -注意: +注意: - 线性表中的元素的位序是从1开始的,例如1、2、3... - 数组中的元素的下标是从0开始的,例如0、1、2... @@ -47,8 +39,6 @@ typedef struct{ `动态分配`:存储数据的空间在程序执行过程中通过`动态存储分配语句`分配的,即便是数据空间占满,也可以另外开辟一块更大的空间,来替换原来的存储空间,满足扩充数据空间的目的。(有点动态规划的意思....)最重要的是:**不需要像静态分配那样,一次性地固定线性表的空间和大小** - - ```c #define InitSize 100 // 表长度初始化 @@ -79,21 +69,14 @@ L.data=new ElemType[InitSize]; **动态分配不是链式存储,而是属于顺序存储结构**,动态分配的物理结构没有改变,依然是随机存取的方式。只是分配的空间大小可以在运行时决定; - #### 顺序表的特点 - - 随机访问【这是最主要的特点】,通过存储起始地址和元素序号O(1)时间内访问指定元素。 - 存储密度高,没有结点只存储数据元素,不像索引存储那样,还需要索引表什么的.. - 逻辑上相邻的元素物理上也相邻,插入和删除需要移动大量元素 - - - - ### 基本操作 - #### 插入 在顺序表L的第i(1≤i≤L.length+1)个位置插入新的元素e @@ -149,7 +132,6 @@ bool ListInsert(SqList &L, int i, ElemType e){ - 最坏情况:在表头插入,元素后移循环执行n次,时间复杂度为O(n); - 平均情况:随机插入,平均次数为:n/2,对应的平均复杂度为O(n); - **线性表插入算法的平均时间复杂度为:O(n)** > Tips: 需要根据实现代码理解循环为什么是从后往前来实现元素后移,通过for循环可以很明显的看出表尾插入快,表头插入慢 @@ -200,27 +182,22 @@ bool ListDelete(SqList &L, int i, ElemType &e){ ``` 从这里来看,删除、插入元素都会涉及到大量的元素的移动(最好情况例外),总结而言: + - 元素从后往前移,循环从前往后遍历 - 元素从前往后移,循环从后往前遍历 - **时间复杂度:** - - 最好情况:删除表尾元素,不需要移动任何元素,时间复杂度为O(1); - 最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为O(n); - 平均情况:随机删除,平均需要(n-1)/2,对应的时间复杂度为O(n); - - **线性表删除算法的平均时间复杂度为O(n);** - #### 按值查找(顺序查找) 在顺序表L中查找第一个元素值等于e的元素,并返回位序 - ```cpp /* * @Description: 顺序表的按值查找(顺序查找) @@ -249,19 +226,12 @@ int LocateElem(SqList L,ElemType e){ 注意理解`位序`的含义,即元素在线性表中的位置序号,角标为`i`(角标从0开始),对应的位序为`i+1`(位序从1开始)。当返回为0时,则直接代表没有`命中`; - **时间复杂度:** - 最好情况:查找的元素在表头,只需要比较一次,循环成本最小,时间复杂度为O(1); - 最坏情况:查找的元素在表尾或者不存在,需要完整遍历,比较n次,时间复杂度为O(n); - 平均情况:随机查找表上的第i个(1≤i≤L.length)元素,平均次数为(n+1)/2,对应时间复杂度为O(n) - - **线性表按值查找(顺序查找)的平均时间复杂度为O(n);** - - - - -**顺序存取是读写方式,不是存储结构;顺序存储是存储结构,包括有:顺序存储、链式存储、索引存储、散列存储** \ No newline at end of file +**顺序存取是读写方式,不是存储结构;顺序存储是存储结构,包括有:顺序存储、链式存储、索引存储、散列存储** diff --git a/docs/manuscripts/ds/linear-table/3.chained_representation.md b/docs/manuscripts/ds/linear-table/3.chained_representation.md index a64e27f..43cc0e7 100644 --- a/docs/manuscripts/ds/linear-table/3.chained_representation.md +++ b/docs/manuscripts/ds/linear-table/3.chained_representation.md @@ -10,17 +10,12 @@ root(链式表示) 顺序表的插入、删除操作需要移动大量元素,影响了运行效率(虽然时间复杂度为O(1)的情况也存在)。 - **链式存储线性表时,不需要使用连续的存储单元,不要求逻辑上相邻的两个元素在物理位置上也相邻** - 理解“链”的含义,链条--->捆绑、指向------>指针 - **链式存储线性表时,对线性表的插入、删除元素是不需要移动元素的,只是需要修改指针** - - ## 单链表 ```mindmap @@ -36,16 +31,14 @@ root(单链表) 计算表长 ``` - ### 基本概念 线性表的链式存储称作`单链表`,通过**一组任意的存储单元**来存储线性表中的数据元素。 - 每个链表结点(node)除了存放元素自身的信息外,还需要存放一个指向其后继结点的指针。目的是:**通过指针建立起链表元素之间的线性关系** - 单链表中结点类型的描述: + ```cpp // 单链表结点类型定义 @@ -56,17 +49,12 @@ typeof struct LNode{ ``` - 单链表可以解决顺序表需要大量连续存储空间的缺点,但是单链表在数据域的基础上附加了指针域,存在浪费存储空间的缺点; - 单链表的元素是**离散地分布**在存储空间中的,因此**单链表是非随机存取的存储结构**,不能直接找到表中特定的结点,需要从头开始遍历、一次查找; - 通常,**头指针用来标识一个单链表**。头指针指向`NULL`时,标识单链表为空。 - - ### 头结点 为了操作上的方便,在单链表第一个结点之前附加一个结点,叫做**头结点**。 @@ -74,9 +62,6 @@ typeof struct LNode{ - 头结点的数据域可以不存任何信息、也可以记录表长等基础信息 - 头结点的指针域指向线性表的第一个元素结点; - - - **不论单链表是否带头结点(可选),头指针始终指向链表的第一个结点。** 头结点是带头结点的链表中的第一个结点【重要】 @@ -84,19 +69,15 @@ typeof struct LNode{ - 头结点的数据域可以不存任何信息、也可以记录表长等基础信息 - 头结点的指针域指向线性表的第一个元素结点; - 头结点的优点: - 因为开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表的其他位置上的操作一致,不需要进行特殊处理; - 无论链表是否为空,头指针始终是指向头结点的头结点的非空指针【空表中,往往就只有头结点,此时头结点的指针域为空,可以有效避免头指针空指针异常问题】-----> **头结点的引入,很好的统一了空表和非空表的操作;** - - ### 头插法 > 从空表开始,生成新的结点,将读取的数据存放在新结点的数据域中,将新结点插入到当前链表的表头【头结点之后】 - ```cpp /* * @Description: 单链表头插法创建 @@ -140,14 +121,12 @@ LinkList CreateListWithStartNode(LinkList &L){ - 读入数据的顺序与生成的链表中的元素顺序是相反的【结合队列先进先出思考】 - 每个结点插入的时间复杂度为O(1),单链表长度为n时,头插法的时间复杂度为O(n)【结合算法中的while循环,可以很明确看出时间复杂度】 - ### 尾插法 头插法建立的单链表,链表中结点的次序和输入数据的顺序不一致【相反】,尾插法则很好的避免了这个问题; >新结点插入到当前链表的表尾上,必须增加一个尾指针r,始终指向当前链表的尾结点; - ```cpp /* @@ -200,13 +179,10 @@ LinkList CreateListWithEndNode(LinkList &L){ - 每个结点插入的时间复杂度为O(1),单链表长度为n时,尾巴插法的时间复杂度为O(n)【结合算法中的while循环,可以很明确看出时间复杂度】 - 相比头插法附设了一个指向表尾结点的指针,但时间复杂度与头插法相同 - - ### 按序号查找 > 在单链表中从第一个结点出发,顺指针next域逐个往下搜索、遍历,直到找出第i个结点为止,否则返回最后一个结点指针域NULL - ```cpp /* @@ -254,13 +230,10 @@ LNode *GetElem(LinkList L,int i){ 需要遍历(扫描)单链表,时间复杂度为:O(n) - - ### 按值查找 > 从单链表的第一个结点开始,从前往后依次比较表中个结点数据域的值,等于给定值e,则返回该结点的指针;若整个单链表【遍历完】中没有数据域值为e的结点,则返回NULL; - ```cpp LNode *LocateElem(LinkList L,ElemType e){ @@ -280,11 +253,11 @@ LNode *LocateElem(LinkList L,ElemType e){ } ``` + 链表遍历无法匹配,会返回NULL,因为在尾结点无法匹配的时候,直接返回尾结点指针域 需要遍历(扫描)单链表,时间复杂度为:O(n) - ### 结点插入 > 单链表中,将值为x的新结点插入到单链表的第i个位置上 @@ -312,14 +285,10 @@ LNode *LocateElem(LinkList L,ElemType e){ **上面的过程不能更换,避免后继指针不存在的问题** - 最后的最后,一定要注意将s的数据域赋值x - 插入结点的时间复杂度集中在查找第(i-1)个元素,时间复杂度为O(n);如果在给定结点的后面插入新结点,只需要执行`p->next=s`操作,时间复杂度为O(1) - - #### 前插操作 > 在某结点的前面插入一个新的结点 @@ -330,7 +299,6 @@ LNode *LocateElem(LinkList L,ElemType e){ > 在某结点的后面插入一个新的结点,单链表插入算法中,通常采用后插操作的 - ```cpp // 结点s插入到结点p的前面,修改指针域,顺序不能改变 @@ -347,17 +315,14 @@ s->data=temp; 上述借助临时变量`temp`来将结点s和结点p的数据域进行交换,需要开辟O(1)的空间复杂度,但是时间复杂度却从O(n)改变为O(1),典型的空间换时间策略 - ### 删除结点 > 将单链表L的第i个结点元素删除; - - 第一步: 先检查删除位置的合法性; - 第二步: 查找表中的第(i-1)个结点,即被删结点的前驱结点; - 第三步: 移动指针,删除结点元素; - ```cpp // 获取删除位置结点元素的前驱结点 @@ -376,9 +341,6 @@ free(q) 和插入算法一样,时间都消耗在查询前驱结点上,时间复杂度为:O(n) - - - > 删除单链表L中给点结点元素*p,通常是按值查找获取到p结点的前驱元素,再执行删除操作,这样很明显会导致时间复杂度为:O(n),主要都消耗在`按值查找`上 这里可以利用p结点的后继结点将p结点删除 @@ -388,7 +350,6 @@ free(q) - 第三步:p的指针域指向q的指针域,q结点从链中“断开” - 第四步:释放q的内存空间 - ```cpp // 存放p的后继结点指针 q=p->next; @@ -404,18 +365,14 @@ free(q) 相比按值查找前驱结点来删除给定的结点p,利用后继结点来删除的时间复杂度更小,为:O(1) - - ### 计算表长 > 计算单链表中数据结点(不含头结点)的个数 - 算法思路:从第一个结点开始顺序依次访问表中的每一个结点,为此需要设置一个`计数器变量`,每访问一个结点,计算器加1,直到访问到空结点为止。 算法时间复杂度:O(n) - **单链表的长度是不包括头结点的,不带头结点和带头结点的单链表在求表长操作上会略有不同。** 不带头结点的单链表,当表为空时候,需要单独处理; @@ -438,7 +395,6 @@ if(L->next===NULL){ ## 双链表 - ```mindmap root(双链表) 基本特点 @@ -446,22 +402,19 @@ root(双链表) 删除结点 ``` - 从单链表的结构上来看 + - 访问特定结点的前驱结点需要遍历整个单链表,移动指针,时间复杂度为:O(n) - 访问特定结点的后继结点只需要移动一次指针,时间复杂度为:O(1) - 双链表的引入,很好的解决单链表访问前驱结点时间消耗大的问题。 - 双链表结点由三部分组成: - `数据域` 存放数据信息 - `prior指针域` 指向结点的前驱结点 - `next指针域` 指向结点的后继结点 - ```cpp // 双链表结点类型 typedef struct DNode{ @@ -472,21 +425,16 @@ typedef struct DNode{ ``` - ### 基本特点 - 双链表仅仅在单链表的结点中增加了一个指向结点前驱的`prior`指针; - `按值查找`、`按序号查找`在单链表和双链表上的操作是相同的。 - 和单链表不同,`插入`、`删除`操作除了修改`next`指针域,双链表还需要修改`prior`指针域,确保不断`链`,时间复杂度都为:O(1) - - - ### 插入结点 > 在双链表中p所指的结点之后插入结点s - ```cpp // 第一步 @@ -524,10 +472,8 @@ free(q); **第一步和第二步顺序可换**,整体时间复杂度为:O(1) - ## 循环链表 - ```mindmap 循环链表 循环单链表 @@ -539,12 +485,10 @@ free(q); ``` - ### 循环单链表 `循环单链表`是在单链表的基础上,将最后一个结点(尾结点)的指针由`NULL`改为指向`头结点`,形成`环`。【单链表----->循环单链表】 - ```cpp // 双链表结点类型 typedef struct DNode{ @@ -559,8 +503,6 @@ typedef struct DNode{ **不是判断头结点的指针是否为空,而是需要判断是否等于头指针**,表为空时,头结点的next指针域其实是指向自己; - - #### 特点 - 在循环单链表中,尾结点*p的next指针域指向链表L(即:头结点),形成了`闭环`,不存在指针域为`NULL`的结点。 @@ -569,14 +511,10 @@ typedef struct DNode{ - **循环单链表可以抽象为时钟,形成的`环`是有顺序的;** - 频繁的`表头`和`表尾`操作,可以对循环单链表设置`尾指针`,而不设置`头指针`,明确尾指针r后,头指针即为:`r->next` ,减少头指针到尾指针间的遍历,时间复杂度:O(n)---->O(1) - - - ### 循环双链表 `循环双链表`是在双链表的基础上,将`尾结点`的`next`指针指向`头结点`,将`头结点`的`prior`指针指向`尾结点`。【双链表----->循环双链表】 - ```cpp // 双链表结点类型 typedef struct DNode{ @@ -594,12 +532,10 @@ typedef struct DNode{ - p->next=L - p->prior=L - #### 基本特点 - 从双向链表中的任意一个结点开始,都可以很方便地访问它的`前驱结点`和`后继结点`。 - ## 静态链表 ```mindmap @@ -617,16 +553,12 @@ root(链式表示) > 借助数组来描述线性表的链式存储结构,结点元素同样存在数据域`data`和指针域`next` - 注意: 和普通的链表的指针域不同的是,静态链表的指针是结点元素的相对地址(数组下标),也称为`游标`,建议结合高级语言中数组的概念来理解; - **与顺序表一样,虽然静态链表属于链表,但是存储时需要预先分配一块连续的内存空间** - 静态链表结构类型: - ```cpp // 定义静态链表的最大长度 @@ -641,9 +573,6 @@ typedef struct{ 很显然,静态链表是通过`数组游标`来访问下一个结点元素,可以和`指针域`的相关概念结合理解; - - 静态链表以`next=-1`作为结束的标志【尾结点】 - 和动态链表相同,**插入、删除操作不需要移动元素,只需要修改指针**; - 总体来说,静态链表没有单链表使用方便,需要将整个链表存储在一块连续的内存空间中,内部的存储可以分散,通过指针构成`链`的关系 - - diff --git a/docs/manuscripts/ds/linear-table/4.总结.md b/docs/manuscripts/ds/linear-table/4.总结.md index cd3f316..0ce0b3b 100644 --- a/docs/manuscripts/ds/linear-table/4.总结.md +++ b/docs/manuscripts/ds/linear-table/4.总结.md @@ -17,22 +17,17 @@ root(链式表示) ## 顺序表和链表的比较 - ### 存取方式 - 顺序表支持顺序存取和随机存取; - 链表只能从表头顺序存取元素,支持顺序存取; - ### 逻辑结构与物理结构 - - 顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻【一定性】。 - 链式存储时,逻辑上相邻的元素,对应的物理存储位置不一定相邻【可以相邻,也可以不相邻】。 - 链式存储的逻辑关系通过指针链接表示; - - ### 时间复杂度 #### 按值查找 @@ -40,7 +35,6 @@ root(链式表示) - 顺序表无序的情况下,顺序表和链表的时间复杂度均为O(n) - 顺序表有序的情况下,顺序表的时间复杂度为O(log2n),链表的时间复杂度为O(n); - **注意:O(log2n) < O(n)** #### 按序号查找 @@ -58,7 +52,6 @@ root(链式表示) #### 顺序存储 - ##### 静态分配 - 需要预先分配足够大的存储空间; @@ -71,7 +64,6 @@ root(链式表示) - 动态分配能够扩充存储空间,但需要移动大量元素,操作效率降低 - 内存中没有更大块的连续存储空间,将会导致空间分配失败; - #### 链式存储 - 链式存储的结点空间只在需要的时候申请分配 @@ -85,8 +77,6 @@ root(链式表示) - 链表不用事先估计存储规模,但存储密度较低 - 链式存储结构的存储密度小于1,不要求连续的存储空间 - - ### 基于运算的考虑 - 顺序表支持随机存取,按序号查找顺序表的时间复杂度为O(1); @@ -94,16 +84,11 @@ root(链式表示) - 顺序表的插入、删除操作,平均需要移动表中一半的元素,当表的数据量较大时,这种情况需要重点考虑的。 - 链表的插入、删除操作,也是需要找插入位置(前驱结点、后继结点),主要的操作还是比较操作,相对较好; - - - ### 基于环境的考虑 - 顺序表容易实现,任何高级语言中都有数组类型; - 链表操作是基于指针的,指针移动,相对复杂; - - 综上比较 - 通常比较稳定的线性表选择顺序存储; @@ -119,10 +104,8 @@ root(链式表示) - 静态链表中的指针称为`游标`,指示下一个元素在数组中的`下标` - 静态链表用数组表示,需要预先分配较大的连续空间,同时具有一般链表的特点(插入、删除元素不需要移动元素) - ### 单链表设置头结点 - 目的 > 主要是方便运算。 diff --git a/docs/manuscripts/ds/linear-table/readme.md b/docs/manuscripts/ds/linear-table/readme.md index c00d10f..2843099 100644 --- a/docs/manuscripts/ds/linear-table/readme.md +++ b/docs/manuscripts/ds/linear-table/readme.md @@ -1,3 +1,3 @@ # 线性表 -![](./线性表_水印.png) \ No newline at end of file +![](./线性表_水印.png) diff --git a/docs/manuscripts/ds/readme.md b/docs/manuscripts/ds/readme.md index 859aeb1..fc5fb6a 100644 --- a/docs/manuscripts/ds/readme.md +++ b/docs/manuscripts/ds/readme.md @@ -13,14 +13,12 @@ root(数据结构) 排序 ``` - ## 基础入门 -- [x] 基本概念 -- [x] 数据结构三要素 +- [x] 基本概念 +- [x] 数据结构三要素 - [x] 算法和算法评价 - ## 线性表 - [x] 基础概念和操作 @@ -42,7 +40,6 @@ root(数据结构) - [x] 链式存储结构 - [x] 一些总结 - ## 串 - 基本概念 @@ -58,7 +55,6 @@ root(数据结构) - 树和森林 - 树的应用 - ## 图论 - 基本概念 @@ -66,7 +62,6 @@ root(数据结构) - 图的遍历 - 图的应用 - ## 查找 - 基本概念 @@ -85,15 +80,7 @@ root(数据结构) - 基数排序 - 外部排序 - - - -## 参考资料 +## 参考资料 - 《数据结构》严蔚敏著. - 《数据结构-王道考研》2019 王道论坛. - - - - - diff --git a/docs/manuscripts/ds/串/1.基本概念.md b/docs/manuscripts/ds/串/1.基本概念.md index 6863856..8788987 100644 --- a/docs/manuscripts/ds/串/1.基本概念.md +++ b/docs/manuscripts/ds/串/1.基本概念.md @@ -1,3 +1,3 @@ -# 基本概念 +# 基本概念 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/串/2.简单的模式匹配.md b/docs/manuscripts/ds/串/2.简单的模式匹配.md index c64b747..17bf785 100644 --- a/docs/manuscripts/ds/串/2.简单的模式匹配.md +++ b/docs/manuscripts/ds/串/2.简单的模式匹配.md @@ -1,3 +1,3 @@ -# 简单的模式匹配 +# 简单的模式匹配 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/串/3.KMP算法.md b/docs/manuscripts/ds/串/3.KMP算法.md index f37b152..d251b43 100644 --- a/docs/manuscripts/ds/串/3.KMP算法.md +++ b/docs/manuscripts/ds/串/3.KMP算法.md @@ -1,3 +1,3 @@ -# KMP算法 +# KMP算法 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/串/4.总结.md b/docs/manuscripts/ds/串/4.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/ds/串/4.总结.md +++ b/docs/manuscripts/ds/串/4.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/图论/1.基本概念.md b/docs/manuscripts/ds/图论/1.基本概念.md index ad3ed03..8788987 100644 --- a/docs/manuscripts/ds/图论/1.基本概念.md +++ b/docs/manuscripts/ds/图论/1.基本概念.md @@ -1,5 +1,3 @@ -# 基本概念 +# 基本概念 努力赶稿中,等等我呀... - - diff --git a/docs/manuscripts/ds/图论/2.图的存储.md b/docs/manuscripts/ds/图论/2.图的存储.md index 211d667..2571a37 100644 --- a/docs/manuscripts/ds/图论/2.图的存储.md +++ b/docs/manuscripts/ds/图论/2.图的存储.md @@ -1,3 +1,3 @@ -# 图的存储 +# 图的存储 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/图论/3.图的遍历.md b/docs/manuscripts/ds/图论/3.图的遍历.md index 8700063..6f12c2a 100644 --- a/docs/manuscripts/ds/图论/3.图的遍历.md +++ b/docs/manuscripts/ds/图论/3.图的遍历.md @@ -1,3 +1,3 @@ -# 图的遍历 +# 图的遍历 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/图论/4.图的应用.md b/docs/manuscripts/ds/图论/4.图的应用.md index 6e25ff7..6776c38 100644 --- a/docs/manuscripts/ds/图论/4.图的应用.md +++ b/docs/manuscripts/ds/图论/4.图的应用.md @@ -1,3 +1,3 @@ -# 图的应用 +# 图的应用 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/图论/5.总结.md b/docs/manuscripts/ds/图论/5.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/ds/图论/5.总结.md +++ b/docs/manuscripts/ds/图论/5.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/1.基本概念.md b/docs/manuscripts/ds/排序/1.基本概念.md index 6863856..8788987 100644 --- a/docs/manuscripts/ds/排序/1.基本概念.md +++ b/docs/manuscripts/ds/排序/1.基本概念.md @@ -1,3 +1,3 @@ -# 基本概念 +# 基本概念 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/2.插入排序.md b/docs/manuscripts/ds/排序/2.插入排序.md index 1fe7354..cbb666a 100644 --- a/docs/manuscripts/ds/排序/2.插入排序.md +++ b/docs/manuscripts/ds/排序/2.插入排序.md @@ -1,3 +1,3 @@ -# 插入排序 +# 插入排序 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/3.交换排序.md b/docs/manuscripts/ds/排序/3.交换排序.md index 3fb36ab..34395d2 100644 --- a/docs/manuscripts/ds/排序/3.交换排序.md +++ b/docs/manuscripts/ds/排序/3.交换排序.md @@ -1,3 +1,3 @@ -# 交换排序 +# 交换排序 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/4.选择排序.md b/docs/manuscripts/ds/排序/4.选择排序.md index d38aff8..558642f 100644 --- a/docs/manuscripts/ds/排序/4.选择排序.md +++ b/docs/manuscripts/ds/排序/4.选择排序.md @@ -1,3 +1,3 @@ -# 选择排序 +# 选择排序 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/5.归并排序.md b/docs/manuscripts/ds/排序/5.归并排序.md index 90b1733..10ee6b1 100644 --- a/docs/manuscripts/ds/排序/5.归并排序.md +++ b/docs/manuscripts/ds/排序/5.归并排序.md @@ -1,3 +1,3 @@ -# 归并排序 +# 归并排序 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/6.基数排序.md b/docs/manuscripts/ds/排序/6.基数排序.md index 72b39c0..4c84b96 100644 --- a/docs/manuscripts/ds/排序/6.基数排序.md +++ b/docs/manuscripts/ds/排序/6.基数排序.md @@ -1,3 +1,3 @@ -# 基数排序 +# 基数排序 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/7.外部排序.md b/docs/manuscripts/ds/排序/7.外部排序.md index dfecc00..e151517 100644 --- a/docs/manuscripts/ds/排序/7.外部排序.md +++ b/docs/manuscripts/ds/排序/7.外部排序.md @@ -1,3 +1,3 @@ -# 外部排序 +# 外部排序 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/排序/8.总结.md b/docs/manuscripts/ds/排序/8.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/ds/排序/8.总结.md +++ b/docs/manuscripts/ds/排序/8.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/查找/1.基本概念.md b/docs/manuscripts/ds/查找/1.基本概念.md index 6863856..8788987 100644 --- a/docs/manuscripts/ds/查找/1.基本概念.md +++ b/docs/manuscripts/ds/查找/1.基本概念.md @@ -1,3 +1,3 @@ -# 基本概念 +# 基本概念 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/查找/2.顺序查找.md b/docs/manuscripts/ds/查找/2.顺序查找.md index ecaecd0..aa1d667 100644 --- a/docs/manuscripts/ds/查找/2.顺序查找.md +++ b/docs/manuscripts/ds/查找/2.顺序查找.md @@ -1,3 +1,3 @@ -# 顺序查找 +# 顺序查找 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/查找/3.折半查找.md b/docs/manuscripts/ds/查找/3.折半查找.md index 24b6c3e..962077d 100644 --- a/docs/manuscripts/ds/查找/3.折半查找.md +++ b/docs/manuscripts/ds/查找/3.折半查找.md @@ -1,3 +1,3 @@ -# 折半查找 +# 折半查找 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/查找/4.B树和B+树.md b/docs/manuscripts/ds/查找/4.B树和B+树.md index 27ea162..ac499bf 100644 --- a/docs/manuscripts/ds/查找/4.B树和B+树.md +++ b/docs/manuscripts/ds/查找/4.B树和B+树.md @@ -1,3 +1,3 @@ -# B树和B+树 +# B树和B+树 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/查找/5.散列表.md b/docs/manuscripts/ds/查找/5.散列表.md index dfd5651..e1076bb 100644 --- a/docs/manuscripts/ds/查找/5.散列表.md +++ b/docs/manuscripts/ds/查找/5.散列表.md @@ -1,3 +1,3 @@ -# 散列表 +# 散列表 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/查找/6.总结.md b/docs/manuscripts/ds/查找/6.总结.md index ee304ed..43c0132 100644 --- a/docs/manuscripts/ds/查找/6.总结.md +++ b/docs/manuscripts/ds/查找/6.总结.md @@ -1,3 +1,3 @@ -# 总结 +# 总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/栈和队列/1.栈的基本概念和基本操作.md b/docs/manuscripts/ds/栈和队列/1.栈的基本概念和基本操作.md index ccf9a3f..b378086 100644 --- a/docs/manuscripts/ds/栈和队列/1.栈的基本概念和基本操作.md +++ b/docs/manuscripts/ds/栈和队列/1.栈的基本概念和基本操作.md @@ -7,7 +7,6 @@ permalink: /test `栈`: 只允许在一端进行插入或者删除操作的**线性表**,`后进先出的线性表`。 - - 明确栈是一种线性表 - 限定栈只能在某一端进行插入或者删除操作 @@ -19,31 +18,22 @@ permalink: /test `空栈`:不含任何元素的空表,也叫**栈空** - - 基本结构如下: - - - 在上面的基本结构中,可以假设存在栈S=(a1,a2,a3,a4,a5,a6,a7,a8),很明显 - 栈顶元素:a1 - 栈底元素:a8 - 栈只能在栈顶进行插入和删除操作 - 进栈顺序:a1->a2->a3->a4->a5->a6->a7->a8 - 出栈顺序:a8->a7->a6->a5->a4->a3->a2->a1 - 可以得出结论:栈是后进先出(先进后出),即:LIFO(Last In First Out),也可以叫**后进先出的线性表** - ## 基本操作 - - `InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1 - `StackEmpty(S)`: 判断一个栈是否为空,如果栈空则返回`true`,否则返回`false` - `Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。 @@ -51,6 +41,4 @@ permalink: /test - `GetTop(S,&x)`: 读栈顶元素,若栈`S`非空,用x返回栈顶元素。 - `ClearStack(&S)`: 销毁栈,释放栈`S`占用的存储空间。 - - -> Tips: `&`是C++特有的,可以用来表示引用调用,类似`传址目的`,可以类比指针。 当然,在C语言中*代表指针,指向存储地址,也是具有`传址目的` \ No newline at end of file +> Tips: `&`是C++特有的,可以用来表示引用调用,类似`传址目的`,可以类比指针。 当然,在C语言中*代表指针,指向存储地址,也是具有`传址目的` diff --git a/docs/manuscripts/ds/栈和队列/2.栈的顺序存储结构.md b/docs/manuscripts/ds/栈和队列/2.栈的顺序存储结构.md index 0535312..2e79107 100644 --- a/docs/manuscripts/ds/栈和队列/2.栈的顺序存储结构.md +++ b/docs/manuscripts/ds/栈和队列/2.栈的顺序存储结构.md @@ -1,12 +1,9 @@ - # 栈的顺序存储结构 - `顺序栈`:栈的顺序存储,利用一组地址连续的存储单元存放自栈底到栈顶的所有元素,同时**附加一个用来指向当前栈顶位置的指针** > 指针指向栈顶(top)主要是因为栈在线性表的一端操作,操作的那端就是栈顶,方便操作。 - ## 顺序栈的存储类型 ```cpp @@ -31,20 +28,14 @@ typedef struct{ - 栈满条件:S.top=MaxSize-1 - 栈长:S.top+1 - > Tips: 进栈先移动指针,避免占满,元素无法添加,出现外溢;出栈先取栈顶元素,保证指针永远指向栈顶。 - - 顺序栈的存储结构体定义可以很明显看出,顺序栈的入栈操作会受到数组上界(MaxSize)的约束。 **当对栈的最大使用空间估计不足时,容易出现栈上溢(外溢),需要主动向用户报告反馈,避免出现错误;** - - ## 顺序栈的基本运算 - - `InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1 - `StackEmpty(S)`: 判断一个栈是否为空,如果栈空则返回`true`,否则返回`false` - `Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。 @@ -52,10 +43,8 @@ typedef struct{ - `GetTop(S,&x)`: 读栈顶元素,若栈`S`非空,用x返回栈顶元素。 - `ClearStack(&S)`: 销毁栈,释放栈`S`占用的存储空间。 - ### 初始化 - `InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1 ```cpp @@ -67,7 +56,6 @@ void InitStack(&S){ ``` - ### 栈空判断 `StackEmpty(S)`: 判断一个栈是否为空,即:栈顶指针是否为-1,如果栈空则返回`true`,否则返回`false` @@ -86,10 +74,8 @@ bool StackEmpty(S){ ``` - ### 进栈 - `Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。 ```cpp @@ -108,6 +94,7 @@ bool Push(SqStack &S,ElemType x){ } ``` + 注意: - 进栈先移动栈顶指针+1,再操作入栈元素 @@ -139,8 +126,6 @@ bool Pop(SqStack &S,ElemType &x){ - 出栈操作,先让元素出栈,获取栈顶元素,再移动指针-1 - `i--`是先使用变量i,再对变量做递减操作,即:先用后加(减) - - ### 读(获取)栈顶元素 `GetTop(S,&x)`: 读栈顶元素,若栈`S`非空,用x返回栈顶元素。 @@ -164,8 +149,6 @@ bool GetTop(SqStack S,ElemType &x){ ``` - - **上面的这些操作都是基于栈顶指针初始化为`-1`的情况** 当栈顶指针初始化为`S.top=0`,相关操作操作会有区别: @@ -173,21 +156,16 @@ bool GetTop(SqStack S,ElemType &x){ - 入栈: `S.data[S.top++]=x` - 出栈: `x=S.data[--S.top]` - **同时, 栈空、栈满条件也会有变化,要仔细对比揣摩** - - ## 共享栈 - `共享栈`:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个`一维存储空间`,将两个栈的栈底分别设置在共享空间的两端,两个栈顶则向共享空间的中间延伸 >Tips: 类似头对头,一致对外这种感觉,噗呲哈哈 ![顺序栈共享存储空间](./images/顺序栈共享存储空间.png) - 在上面的共享栈结构图中,两个栈(0、1号顺序栈)的栈顶指针都指向栈顶元素 - 0号栈栈顶指针`top=-1`时,0号栈为空 @@ -195,13 +173,10 @@ bool GetTop(SqStack S,ElemType &x){ 当且仅当两个栈的栈顶指针相邻(`top1-top0=1`),可以判断共享栈栈满 - ### 进栈 - > 进栈:先移动指针,后进行赋值 - - 当0号栈进栈时,0号栈栈顶指针top0`先加1后赋值` - 当1号栈进栈时,0号栈栈顶指针top1`先减1后赋值` @@ -209,13 +184,9 @@ bool GetTop(SqStack S,ElemType &x){ > 出栈:先进行赋值,后移动指针 - - 当0号栈进栈时,0号栈栈顶指针top0`先赋值后减1` - 当1号栈进栈时,0号栈栈顶指针top1`先赋值后加1` - - 共享栈能够更有效的利用存储空间,两个栈空间进行相互调节。只有当这个存储空间(即:共享空间)被占满时才会发生上溢。存取数据的时间复杂度都为O(1),在栈顶操作。 - -**共享栈对存取效率没有什么影响** \ No newline at end of file +**共享栈对存取效率没有什么影响** diff --git a/docs/manuscripts/ds/栈和队列/3.栈的链式存储结构.md b/docs/manuscripts/ds/栈和队列/3.栈的链式存储结构.md index c4bed53..c518b7e 100644 --- a/docs/manuscripts/ds/栈和队列/3.栈的链式存储结构.md +++ b/docs/manuscripts/ds/栈和队列/3.栈的链式存储结构.md @@ -6,15 +6,12 @@ `栈空`:对于空栈来说,链表原来的定义是头指针指向空,那么链栈的空其实就是`top=NULL`,链栈元素总数为0 - 栈只是栈顶在做插入和删除操作,栈顶应该放在单链表的头部,所以单链表中的头结点也就失去了意义。 **通常对于链栈来说,是不需要头结点的,当然也存在带头结点的链栈** - ![](./images/栈的链式存储结构.png) - 栈的链式存储类型: ```cpp @@ -29,15 +26,15 @@ typedef struct LinkNode{ typedef struct StackNode { - int data;//结点数据域 - struct StackNode* next;//结点指针域 + int data;//结点数据域 + struct StackNode* next;//结点指针域 }StackNode,* Linktop; //链栈的数据结构 typedef struct LinkStack { - Linktop top; //栈顶结点,定义了一个指向上个结构体的指针 - int count;//元素个数 + Linktop top; //栈顶结点,定义了一个指向上个结构体的指针 + int count;//元素个数 }LinkStack; ``` @@ -48,13 +45,11 @@ typedef struct LinkStack - 不存在栈满上溢的情况,避免程序因溢出导致出错 - 有效的提高存取效率 - ## 进栈 - 如果链栈不存在,则栈满,入栈操作失败,返回false; - 如果链栈存在,进行单链表的结点插入操作,移动指针,结点元素赋值,再将结点压入链栈中,移动链栈栈顶指针,最后链栈元素总数+1,返回true - ```cpp /* @@ -70,7 +65,7 @@ bool linkStackPushNode(LinkStack* linkStack,int e){ // 判断链栈是否存在 if (!linkStack){ //链栈不存在,无法进栈操作,返回false - return false; + return false; } // 开辟栈结点元素内存控件 StackNode* node = (StackNode*)malloc(sizeof(StackNode)); @@ -92,7 +87,6 @@ bool linkStackPushNode(LinkStack* linkStack,int e){ - 如果链栈不存在,或者为空栈,则无法进行出栈操作,返回false - 如果链栈满足出栈条件,则通过栈顶指针获取到链栈栈底结点,将其数据域赋值给变量e,移动栈顶指针指向待出栈元素的后继结点,同时释放待出栈元素的内存空间,链栈元素总数-1 ,出栈成功,返回true. - ```cpp /* @@ -107,7 +101,7 @@ bool linkStackPopNode(LinkStack* linkStack,int *e){ // 判断链栈是否存在及是否为空 if (!linkStack || linkStack->count==0){ //出栈失败,返回false - return false; + return false; } // 获取栈顶元素结点 StackNode* node = stack->top; @@ -126,5 +120,4 @@ bool linkStackPopNode(LinkStack* linkStack,int *e){ ``` - -以上是基于单链表的链栈入栈、出栈操作,很明显**时间复杂度都为O(1)**,重点`注意移动指针,保持不断链` \ No newline at end of file +以上是基于单链表的链栈入栈、出栈操作,很明显**时间复杂度都为O(1)**,重点`注意移动指针,保持不断链` diff --git a/docs/manuscripts/ds/栈和队列/4.队列的基本概念和操作.md b/docs/manuscripts/ds/栈和队列/4.队列的基本概念和操作.md index 61f9b6c..f87e97f 100644 --- a/docs/manuscripts/ds/栈和队列/4.队列的基本概念和操作.md +++ b/docs/manuscripts/ds/栈和队列/4.队列的基本概念和操作.md @@ -1,6 +1,5 @@ # 队列的基本概念和操作 - ## 基本概念 `队列`:和栈一样,是一种操作受限制的线性表,只允许在表的一端进行插入,在表的另外一端进行删除,简称为`队`,常记作:`Queue` @@ -9,32 +8,25 @@ `出队`: 删除队列元素,也叫做`离队` - ![](./images/队列的基本结构.png) 结合生活中排队的经验,在群体素质高、无人插队的情况下(`薛定谔排队`,噗呲,哈哈哈),**一般最早排队的也是最早离队的**,和栈的`后进先出`不一样的是,队列是`先进先出`的,即:First In Frist Out > Tips +> > - 栈:又叫做后进先出的线性表 > - 队列:又叫做先进先出的线性表 - - `队头`:允许进行删除操作的一端,也叫做`队首`,常记作:`Front` `队尾`:允许进行插入操作的一端,常记作:`Rear` `空队列`:不含任何元素的空表,注意这个表是指`线性表` - - - ## 基础操作 - > 和栈一样,队列是操作受限的线性表,具有`先进先出`的特性,不是任何对线性表的操作都可以作为队列的操作。例如:无法随便读取到队列中间的某个数据,需要将前面的元素先出队 - - `InitQueue(&Q)`: 初始化一个队列,构造空队列Q - `QueueEmpty(Q)`: 判断队列是否为空,队空返回true,否则返回false - `EnEmpty(&Q,x)`: 入队,如果队列Q未满,将x入队,成为新的队尾元素 diff --git a/docs/manuscripts/ds/栈和队列/5.队列的顺序存储结构.md b/docs/manuscripts/ds/栈和队列/5.队列的顺序存储结构.md index abcdae7..6071150 100644 --- a/docs/manuscripts/ds/栈和队列/5.队列的顺序存储结构.md +++ b/docs/manuscripts/ds/栈和队列/5.队列的顺序存储结构.md @@ -1,7 +1,7 @@ # 队列的顺序存储结构 - > 队列的顺序实现是指分配一块连续的存储单元用来存放队列中的元素,并且附加两个指针。 +> > - `front指针`: 指向队头元素的位置 > - `rear指针`: 指向队尾元素的位置 @@ -20,7 +20,6 @@ typedef struct { } SqQueue; ``` - 假定: - 队头指针指向队头元素 @@ -32,8 +31,6 @@ typedef struct { - 入队操作:队不满时,先赋值给队尾元素,再移动队尾指针+1 - 出队操作: 队不空时,先取队头元素值,再移动队头指针+1 - - ![](./images/入队.png) 在空队列中,初始状态为`Q.front===Q.rear==0`,当元素a入队时,队尾指针rear后移+1,入队成功后,`Q.front==0`、`Q.rear==1`,在队不满的情况下进队,都是`先赋值给队尾元素,再移动队尾指针rear+1`,通过上面的图宝贝可以看到,队列被元素打满的时: @@ -43,7 +40,6 @@ typedef struct { > Tips: MaxSize为队列结构体定义中,最大存储元素个数哦~ - ![](./images/出队.png) 进队说完了,那给宝贝来说说出队吧。以上图为例,队列中`Q.rear==Maxsize`、`Q.front==0`;当出现元素在队首出队,就会直接影响队首指针,从上面的流程上看: @@ -52,20 +48,12 @@ typedef struct { - 当队列中的元素都陆续出队,抛弃了宝贝(都是渣男,噗呲,哈哈哈),指针会是:`Q.rear==Q.front==MaxSize` - - 从上面两张图中,我们来思考: > 前面队空条件为:`Q.front===Q.rear===0`,那能用`Q.rear==MaxSize`来表示队满嘛? - 傻瓜,你在瞅瞅前面的图,明显存在`Q.rear==MaxSize`,但队列确实空的情况呀。队满要灵活判断,可不要死记书上总结的。书上说的很多结论都是有前提的,老师记结论不记前提容易张冠李戴、含糊不清的呀~ - - - - - 很显然,也存在下面这种情况: - 队头指针指向队头元素的前一个位置 @@ -73,60 +61,43 @@ typedef struct { 此时的入队、出队过程就宝贝自己去画流程图咯 - - ## 循环队列 在上面的顺序队列中,当队满后进行出队列,由于顺序队列出队只在队首进行操作,并且只会修改队首指针,这时候就会出现队尾指针一直`Q.rear===MaxSize`情况,就如下: - ![队列队满情况分析](./images/队列队满情况分析.png) 可以很明显的看到,明明队列不满,但是由于进队列只能在队尾操作,因此不能进行进队操作;通常在这种情况下入队就会出现“上溢出”。 > 需要明确的是:上溢出并不是真正的溢出,只是表明在顺序队列中队不满却无法入队的情况,是一种假的”溢出“ - - - 这种情况在顺序队列中是非常常见的,也是顺序队列的一大缺点。为了克服这个缺点,计算机先贤们总是能够有很多很好的办法,这里不得不佩服!!,所以就有了循环队列,**一个将顺序队列臆想为一个环状的空间** - > 很多时候就是这样,为了解决一个问题,从而衍生出一个新的知识 - `循环队列`:把顺序队列臆想为一个环状的空间,将存储队列元素的表从逻辑上看做为一个环 - - ![](./images/循环队列初始化.png) - 当队首指针`Q.front=MaxSize-1`后,再有元素`出队`就前进一个位置自动到位置0了【注意:可以结合时钟来理解,一圈转完了】 - - 初始时:`Q.front=Q.rear=0` - 队首指针进1: `Q.front=(Q.front+1)%MaxSize` - 队尾指针进1: `Q.rear=(Q.rear+1)%MaxSize` - 队列长度: `(Q.rear+MaxSize-Q.front)%MaxSize` - > 是不是理解起来有点抽象,其实我最开始学到这里的时候,也不明白为什么要用`除法取余运算(%)`来实现。后来我看看了手机上的时钟指针,一圈两圈三圈的转,好像就开始悟了...其实这种取余操作在计算机知识体系中还是非常常见的,例如:组成原理中将会学到的补码,据说idea就是来源于时钟.. - **和时钟一样,顺时钟进行时间变换,在出队、入队时,队首、队尾指针都是按顺时针方向进1** - ![](./images/循环队列入队.png) 如上图,循环队列从最开始初始化为空队列时:`Q.front==Q.rear==0`,经过元素a入队,队尾指针顺时针前移`Q.rear+1`,到元素a、b、c、d陆续入队,就好像时钟转完了一圈,循环队列已满,此时发现:`Q.front==Q.rear==0`在队满时候依然成立,所以结合前面提到的初始化对空条件:`Q.front==Q.rear==0`,用`Q.front==Q.rear`来区分`队空`和`队满`是非常不合适的。 - - - ### 如何区别队空还是队满 > 为了很好的区别循环队列的`队空`还是`队满`的情况,一般有三种处理方式. +> #### 牺牲一个单元来区分队空和队满 这种方式**要求在入队时少用一个队列单元**,是一种比较普遍的做法。约定: @@ -137,7 +108,6 @@ typedef struct { - 队空条件:`Q.front==Q.rear` - 队列中元素个数:`(Q.rear+MaxSize-Q.front)%MaxSize` - #### 类型中增设表示元素个数的数据成员 这种就很直接了,直接和MaxSize去比较,就可以有: @@ -145,7 +115,6 @@ typedef struct { - 队空条件: `Q.count=0` - 队满条件: `Q.count=MaxSize` - 值的注意的是:在这个前提下,不论是`队空`还是`队满`,对会存在`Q.front=Q.rear`,这个可以通过前面方案解决。 #### 类型中增设tag数据成员标记 @@ -158,11 +127,12 @@ typedef struct { 可能你会对上面的这两种情况有迷惑,说实话我第一次看的时候,也挺迷惑的,这里我按照我的理解来解释一下: > 在循环队列中增加tag数据成员标记,tag的主要作用: +> > - 在有元素入队的时候,设置tag=1 > - 在有元素出队的时候,设置tag=0 - 对应的算法实现: + ```cpp // 入队算法 // 尾插法:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%Maxsize;Q.tag=1 @@ -194,15 +164,11 @@ int DeLoopQueue(SqQueue &Q, ElemType &x){ } ``` -#### - ## 代码实现 - ### 初始化空队列 - ```cpp /* * @Description: 循环队列初始化,队列为空 @@ -241,7 +207,6 @@ bool isEmpatyLoopQueue(Q){ ``` - ### 入队操作 ```cpp @@ -275,7 +240,6 @@ bool EnLoopQueue(SqQueue &Q, ElemType x){ ### 出队操作 - ```cpp /* @@ -310,6 +274,7 @@ bool DeLoopQueue(SqQueue &Q, ElemType &x){ ``` ### 获取队头元素 + ```cpp /* * @Description: 获取循环队列队头元素 @@ -332,4 +297,4 @@ bool GetLoopQueueHead(SqQueue &Q, ElemType &x){ return true; } } -``` \ No newline at end of file +``` diff --git a/docs/manuscripts/ds/栈和队列/6.队列的链式存储结构.md b/docs/manuscripts/ds/栈和队列/6.队列的链式存储结构.md index 660cb22..cad3de1 100644 --- a/docs/manuscripts/ds/栈和队列/6.队列的链式存储结构.md +++ b/docs/manuscripts/ds/栈和队列/6.队列的链式存储结构.md @@ -6,19 +6,17 @@ - 头指针指向队头结点 - 尾指针指向队尾结点(单链表的最后一个结点) - 这里复习下顺序队列的定义,进行比较学习 > 队列的顺序实现是指分配一块连续的存储单元用来存放队列中的元素,并且附加两个指针。 +> > - 队头指针指向队头元素 > - 队尾指针指向队尾元素的下一个位置 ![](./images/不带头结点的链式队列.png) - 队列的链式存储结构: - ```cpp // 链式队列节点定义 typedef struct{ @@ -52,7 +50,6 @@ typedef struct{ - 出队:判断队列是否为空,队列非空则在队首移动指针,将队首指针指向下一个元素。如果队列中就一个元素,则出队后将成为空队,`Q.rear==Q.front`,最后释放元素内存空间。 - 入队:将元素插入队尾,移动队尾指针,即便为空队列入队,由于队列带有头结点,此时就很好的避免操作队首指针了。 - 特别注意: - 用单链表表示的链式队列非常适合频繁出队、入队、元素变化大的场景 @@ -114,7 +111,6 @@ bool IsEmptyLinkQueue(LinkQueue Q){ ### 入队 - ```cpp /* * @Description: 链式队列入队操作 @@ -142,7 +138,6 @@ void EnLinkQueue(LinkQueue &Q, ElemType x){ ``` - ### 出队 ```cpp @@ -191,8 +186,6 @@ bool DeLinkQueue(LinkQueue &Q, ElemType &x){ ![](./images/链式队列出队.png) - - ## 双端队列 `双端队列`: 允许在两端都可以进行入队和出队操作的队列,元素的逻辑结构仍然是线性结构 @@ -204,18 +197,13 @@ bool DeLinkQueue(LinkQueue &Q, ElemType &x){ - 进队:前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在队列前端进的元素后面; - 出队:无论是前端还是后端出队,先出的的元素排列在后出的元素的前面 - 在双端队列的基础上,还衍生出: - `输入受限的双端队列`:允许在一端进行插入和删除操作,但在另外一端只允许进行删除的双端队列 - `输出受限的双端队列`:允许在一端进行插入和删除曹组,但在另外一端只允许进行插入的双端队列 - 当然,如果`限定双端队列从某个断点插入的元素只能从该端点删除`,那么此时的双端队列就演变为两个栈底相邻的栈了。 - - - ## 知识补充 - 最适合用来链队的链表是:`带队首指针和队尾指针的非循环单链表` @@ -224,8 +212,7 @@ bool DeLinkQueue(LinkQueue &Q, ElemType &x){ - 不论是顺序存储还是链式存储,**栈和队列都只能进行顺序存取(本质是线性表)**。数组是可以做到随机存取(本质是顺序表) - 队列先进先出的特性:`先进队列的元素先出队列,后进队列的元素后出队列` - 特别注意: 队列用链表形式存储时,删除元素,需要从队头删除,一般情况下,仅仅修改头指针,但是如果此时队列中 -仅有一个元素,则尾指针也是需要被修改的。**因为队列中只有一个元素时,删除后队列为空,需要修改尾指针为:`rear=front`** \ No newline at end of file +仅有一个元素,则尾指针也是需要被修改的。**因为队列中只有一个元素时,删除后队列为空,需要修改尾指针为:`rear=front`** diff --git a/docs/manuscripts/ds/栈和队列/7.栈VS队列补充.md b/docs/manuscripts/ds/栈和队列/7.栈VS队列补充.md index eac06bd..90bda70 100644 --- a/docs/manuscripts/ds/栈和队列/7.栈VS队列补充.md +++ b/docs/manuscripts/ds/栈和队列/7.栈VS队列补充.md @@ -3,7 +3,6 @@ > Tips: 这里不会做过多文字介绍相关应用,具体需要自己看书、查资料揣摩 - ```mindmap root(栈VS队列补充) 栈的应用 @@ -12,29 +11,25 @@ root(栈VS队列补充) 矩阵的压缩存储 ``` - - ### 栈的应用 - 括号匹配 - 表达式求值 + > 表达式求值是程序设计语言编译中一个最基本的问题,类似有前缀、中缀、后缀表达式转换等典型问题。 + - 递归 这里重点总结下递归,递归非常重要,是一种很经典的程序设计方法 > 递归的简单定义: 如果在一个函数、过程或数据结构的定义中又应用了自身,那么这个函数、过程或者数据结构称为递归定义的,简称递归。 - - 递归通常把一个大型的复杂问题,层层转化为一个与原问题相似的规模较小的问题来求解。 **递归策略只需要少量的代码就可以描述出解题过程所需要的多次重复的计算,很大程度上减少了程序的代码量,当时通常情况下,递归的效率并不是很高** - 经典的斐波拉切数列,可以用递归来实现: - ```cpp // 定义递归函数,实现斐波拉切数列 @@ -55,7 +50,6 @@ int Fibonacci(n){ 上面很基础的代码,是分`n=0`和`n=1`的情况,先进行过滤,其他情况下则进行递归,其实在日常开发中,经常会有简化的函数封装 - ```cpp // 定义递归函数,实现斐波拉切数列 @@ -97,29 +91,26 @@ int Fibonacci(int n) { // 利用数组,空间换时间 int Fibonacci(n){ // 注意溢出 - int arr[100]={0,1,1} - - // 叠加,结果存放在数组中 - for(let i=3;i<=n;i++){ - arr[i]=arr[i-1]+arr[i-2] - } - return arr[n] + int arr[100]={0,1,1} + + // 叠加,结果存放在数组中 + for(let i=3;i<=n;i++){ + arr[i]=arr[i-1]+arr[i-2] + } + return arr[n] } ``` - 必须注意递归模型不能是循环定义的,满足条件: - 递归表达式(递归体) - 边界条件(递归出口),即:算法结束条件 - 递归的精髓在于是否能够将原来的问题转化为属性相同但规模较小的问题。有点类似实现目标过程中,将大目标转化为小目标(1亿....)来解决,噗呲啊哈哈哈 **递归次数过多容易造成栈溢出,效率不高的主要原因是递归调用过程中包含很多重复的计算** - ### 队列的应用 - 层次遍历 @@ -128,23 +119,19 @@ int Fibonacci(n){ - 计算机系统 - 队列在计算机系统中的应用非常广泛,作用: - 解决主机和外部设备之间速度不匹配的问题(例如:内存和打印机) - 解决由多用户引起的资源竞争问题(例如:操作系统中的进程调度...) - 其实,队列在计算机系统的中应用, 在看完操作系统那本书后,就会很好理解,建议学到这里,也去翻翻操作系统,汤晓丹那本很经典哟... - # 特殊矩阵的压缩存储 > 这部分知识我个人觉得以了解为主,复习、学习的时候还是要以前面的部分为主! 矩阵在`计算机图形学`、`工程计算`中占有举足轻重的地位。 - ### 数组的定义 `数组`: 由n(n≥1)个相同类型的数据元素构成的有限序列。 @@ -152,21 +139,19 @@ int Fibonacci(n){ 每个数据元素称为一个数组元素,同时每个元素受n个线性关系的约束,**每个元素在n个线性关系中的序号称为元素的`下标`**,称为该数组为n的数组。 数组和线性表的关系: + - 数组是线性表的推广。 - 数组一旦被定义,维数和维界就不再改变。 - 除了结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。 - 一维数组可以看做是一个线性表 二维数组可以看做元素是线性表的线性表 .... - ### 矩阵的压缩存储 - `压缩存储`:多个值相同的元素只分配一个存储空间,对零元素不分配存储空间---->节省存储空间。 `特殊矩阵`:具有很多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。 @@ -180,18 +165,14 @@ int Fibonacci(n){ `稀疏矩阵`:矩阵元素个数s相对于矩阵中非零元素的个数t来说非常多、差距非常大,即`s>>t的矩阵`可以叫`稀疏矩阵` - 注意: - 常规方法来存储稀疏矩阵,会想当浪费存储空间,所以稀疏矩阵只需要存储非零元素 - 通常非零元素的分布是没有规律的,除了存储非零元素外,还需要存储元素所在位置的行和列 - 寻相互存储三元组 `<行标,列表,值>` - - ![](./images/稀疏矩阵的存储变换.png) 三元组的结点存储了行标(row)、列表(col)、值(value)三种信息,是主要用来存储稀疏矩阵的一种数据结构。 - -**注意:矩阵压缩存储的目的就是为了节省空间,已经存过的就不存或者少存(经典想法)** \ No newline at end of file +**注意:矩阵压缩存储的目的就是为了节省空间,已经存过的就不存或者少存(经典想法)** diff --git a/docs/manuscripts/ds/栈和队列/readme.md b/docs/manuscripts/ds/栈和队列/readme.md index 1942e57..3609391 100644 --- a/docs/manuscripts/ds/栈和队列/readme.md +++ b/docs/manuscripts/ds/栈和队列/readme.md @@ -1,3 +1,3 @@ # 栈和队列 -![](./栈和队列_水印.png) \ No newline at end of file +![](./栈和队列_水印.png) diff --git a/docs/manuscripts/ds/树和二叉树/1.基本概念.md b/docs/manuscripts/ds/树和二叉树/1.基本概念.md index 6863856..8788987 100644 --- a/docs/manuscripts/ds/树和二叉树/1.基本概念.md +++ b/docs/manuscripts/ds/树和二叉树/1.基本概念.md @@ -1,3 +1,3 @@ -# 基本概念 +# 基本概念 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/树和二叉树/2.二叉树.md b/docs/manuscripts/ds/树和二叉树/2.二叉树.md index a2ea006..a7719e1 100644 --- a/docs/manuscripts/ds/树和二叉树/2.二叉树.md +++ b/docs/manuscripts/ds/树和二叉树/2.二叉树.md @@ -1,3 +1,3 @@ -# 二叉树 +# 二叉树 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/树和二叉树/3.二叉树的遍历.md b/docs/manuscripts/ds/树和二叉树/3.二叉树的遍历.md index 9eedb0d..e310e54 100644 --- a/docs/manuscripts/ds/树和二叉树/3.二叉树的遍历.md +++ b/docs/manuscripts/ds/树和二叉树/3.二叉树的遍历.md @@ -1,3 +1,3 @@ -# 二叉树的遍历 +# 二叉树的遍历 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/树和二叉树/4.线索二叉树.md b/docs/manuscripts/ds/树和二叉树/4.线索二叉树.md index 3738954..6897ead 100644 --- a/docs/manuscripts/ds/树和二叉树/4.线索二叉树.md +++ b/docs/manuscripts/ds/树和二叉树/4.线索二叉树.md @@ -1,3 +1,3 @@ -# 线索二叉树 +# 线索二叉树 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/树和二叉树/5.树和森林.md b/docs/manuscripts/ds/树和二叉树/5.树和森林.md index 90447b0..41a9b1a 100644 --- a/docs/manuscripts/ds/树和二叉树/5.树和森林.md +++ b/docs/manuscripts/ds/树和二叉树/5.树和森林.md @@ -1,3 +1,3 @@ -# 树和森林 +# 树和森林 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/树和二叉树/6.树的应用.md b/docs/manuscripts/ds/树和二叉树/6.树的应用.md index 438de47..12f5457 100644 --- a/docs/manuscripts/ds/树和二叉树/6.树的应用.md +++ b/docs/manuscripts/ds/树和二叉树/6.树的应用.md @@ -1,3 +1,3 @@ -# 树的应用 +# 树的应用 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/ds/树和二叉树/7.总结.md b/docs/manuscripts/ds/树和二叉树/7.总结.md index 0e7e117..b78efa4 100644 --- a/docs/manuscripts/ds/树和二叉树/7.总结.md +++ b/docs/manuscripts/ds/树和二叉树/7.总结.md @@ -1,3 +1,3 @@ -# 一些总结 +# 一些总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/mark-map/ccp-map.md b/docs/manuscripts/mark-map/ccp-map.md index cd7ab6e..26db8df 100644 --- a/docs/manuscripts/mark-map/ccp-map.md +++ b/docs/manuscripts/mark-map/ccp-map.md @@ -15,5 +15,3 @@ ## 输入输出系统 ## 一些总结 - - diff --git a/docs/manuscripts/mark-map/cn-map.md b/docs/manuscripts/mark-map/cn-map.md index d41e997..d6420c1 100644 --- a/docs/manuscripts/mark-map/cn-map.md +++ b/docs/manuscripts/mark-map/cn-map.md @@ -14,4 +14,4 @@ ## 应用层 -## 一些总结 \ No newline at end of file +## 一些总结 diff --git a/docs/manuscripts/mark-map/ds-map.md b/docs/manuscripts/mark-map/ds-map.md index df78415..db915a1 100644 --- a/docs/manuscripts/mark-map/ds-map.md +++ b/docs/manuscripts/mark-map/ds-map.md @@ -2,151 +2,150 @@ 在线预览 - ## 基础入门 ### 基本概念 - 数据 - - 信息的载体 - - 客观事物属性的数、字符以及所有能够输入到计算机包中并且被计算机程序识别和处理的集合 + - 信息的载体 + - 客观事物属性的数、字符以及所有能够输入到计算机包中并且被计算机程序识别和处理的集合 - 数据元素 - - 数据的基本单位 - - 一个数据元素由若干个数据项组成 - - 数据项是构成数组元素的最小单位,且不可分割 + - 数据的基本单位 + - 一个数据元素由若干个数据项组成 + - 数据项是构成数组元素的最小单位,且不可分割 - 数据对象 - - 具有相同性质的数据元素的集合 - - 数据的子集 + - 具有相同性质的数据元素的集合 + - 数据的子集 - 数据类型 - - 原子类型:不可再分的数据类型 - - 结构类型:可以分解成若干分量(成分)的数据类型 - - 抽象数据类型:抽象出具组织和其相关的操作 + - 原子类型:不可再分的数据类型 + - 结构类型:可以分解成若干分量(成分)的数据类型 + - 抽象数据类型:抽象出具组织和其相关的操作 - 抽象数据类型(ADT) - - 定义:一个数学模型以及定义在该模型上的一组操作 - - 特点:与计算机内部如何表示和实现是没有关系 - - 作用:数据封装和信息隐藏,让实现与使用相分离 - - 注意:不论内部结构如何变化,只要其数学特性不变,就不会影响到外部的使用 + - 定义:一个数学模型以及定义在该模型上的一组操作 + - 特点:与计算机内部如何表示和实现是没有关系 + - 作用:数据封装和信息隐藏,让实现与使用相分离 + - 注意:不论内部结构如何变化,只要其数学特性不变,就不会影响到外部的使用 ### 数据结构(三要素) - 逻辑结构 - - 线性结构:线性表、栈、队列、串、数组... - - 非线性结构:树、图、集合... - - 集合:除了“同属于一个集合”的关系外,别无其他关系。 - - 线性结构:只存在一对一的关系。 - - 树形结构:存在一对多的关系。 - - 图状结构和网状结构:存在多对多的关系。 + - 线性结构:线性表、栈、队列、串、数组... + - 非线性结构:树、图、集合... + - 集合:除了“同属于一个集合”的关系外,别无其他关系。 + - 线性结构:只存在一对一的关系。 + - 树形结构:存在一对多的关系。 + - 图状结构和网状结构:存在多对多的关系。 - 存储(物理)结构 - - 顺序存储 + - 顺序存储 - - 逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现 - - 优点 + - 逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现 + - 优点 - - 可以实现随机存取 - - 元素占用最少的存储空间 + - 可以实现随机存取 + - 元素占用最少的存储空间 - - 缺点 + - 缺点 - - 只能使用相邻的一整块存储单元,依赖于物理结构相邻 - - 容易产生外部碎片 + - 只能使用相邻的一整块存储单元,依赖于物理结构相邻 + - 容易产生外部碎片 - - 链式存储 + - 链式存储 - - 与顺序存储不同,链式存储不要求逻辑上相邻的元素在物理位置上也相邻 - - 优点 + - 与顺序存储不同,链式存储不要求逻辑上相邻的元素在物理位置上也相邻 + - 优点 - - 不会出现碎片现象 - - 充分利用所有存储单元 + - 不会出现碎片现象 + - 充分利用所有存储单元 - - 缺点 + - 缺点 - - 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习) - - 链式存储,只能实现顺序存取,不能实现随机存取(指针的遍历) + - 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习) + - 链式存储,只能实现顺序存取,不能实现随机存取(指针的遍历) - - 索引存储 + - 索引存储 - - 存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的索引表 - - 优点 + - 存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的索引表 + - 优点 - - 检索快(就好比字典有了目录,查询就很快了) + - 检索快(就好比字典有了目录,查询就很快了) - - 缺点 + - 缺点 - - 增加了索引表,占用较多的存储空间(典型的空间换时间策略) - - 增加、删除数据时,需要对应修改索引表,花费更多时间 + - 增加了索引表,占用较多的存储空间(典型的空间换时间策略) + - 增加、删除数据时,需要对应修改索引表,花费更多时间 - - 散列(Hash)存储 + - 散列(Hash)存储 - - 根据元素的关键字直接通过散列(Hash)函数计算出元素的存储地址。 - - 优点 + - 根据元素的关键字直接通过散列(Hash)函数计算出元素的存储地址。 + - 优点 - - 检索快 - - 添加、删除元素结点操作快(获取元素地址直接,整体时间就少了) + - 检索快 + - 添加、删除元素结点操作快(获取元素地址直接,整体时间就少了) - - 缺点 + - 缺点 - - 非常依赖于散列函数 - - 会出现散列冲突(主要依赖与散列函数,散列函数不好就很容易出现散列冲突) - - 出现散列冲突时,解决冲突就会增加时间和空间上的开销 + - 非常依赖于散列函数 + - 会出现散列冲突(主要依赖与散列函数,散列函数不好就很容易出现散列冲突) + - 出现散列冲突时,解决冲突就会增加时间和空间上的开销 - 数据的运算 - - 运算的定义:针对逻辑结构,指出运算的功能 - - 运算的实现:针对存储结构,指出运算的具体操作步骤 + - 运算的定义:针对逻辑结构,指出运算的功能 + - 运算的实现:针对存储结构,指出运算的具体操作步骤 ### 算法与算法评价 - 算法 - - 定义 + - 定义 - - 对特定问题求解步骤的一种描述 - - 是指令的有序集合 - - 每一条指令表示一个或多个操作 + - 对特定问题求解步骤的一种描述 + - 是指令的有序集合 + - 每一条指令表示一个或多个操作 - - 五大特性 + - 五大特性 - - 有穷性:执行有穷步后结束、在有穷时间内完成 - - 确定性:每条指令的含义明确,不会产生二义性,对相同的输入只能得出相同的结果 - - 可行性:算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的 - - 输入:有零个或者多个输入,输入取决于某个特定的对象的集合 - - 输出:有一个或者多个输出,输出是和输入有着某种特定关系的量 + - 有穷性:执行有穷步后结束、在有穷时间内完成 + - 确定性:每条指令的含义明确,不会产生二义性,对相同的输入只能得出相同的结果 + - 可行性:算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的 + - 输入:有零个或者多个输入,输入取决于某个特定的对象的集合 + - 输出:有一个或者多个输出,输出是和输入有着某种特定关系的量 - - 好算法追求的目标 + - 好算法追求的目标 - - 正确性:需要正确的解决求解问题 - - 可读性:便于理解 - - 健壮性:在输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果 - - 效率与低存储量需求 + - 正确性:需要正确的解决求解问题 + - 可读性:便于理解 + - 健壮性:在输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果 + - 效率与低存储量需求 - - 效率:算法执行的时间--->时间复杂度 - - 存储量需求:算法那执行过程中所有要的最大存储空间--->空间复杂度 + - 效率:算法执行的时间--->时间复杂度 + - 存储量需求:算法那执行过程中所有要的最大存储空间--->空间复杂度 - 算法的评价 - - 程序语句频度:程序语句在算法中被重复执行的次数 - - 时间复杂度O(n) + - 程序语句频度:程序语句在算法中被重复执行的次数 + - 时间复杂度O(n) - - 最坏空间复杂度:最坏情况下,算法的时间复杂度 - - 平均空间复杂度:所有可能输入实例在同等概率出现的情况下,算法的期望运行时间 - - 最好空间复杂度:最好的情况下,算法的时间复杂度 + - 最坏空间复杂度:最坏情况下,算法的时间复杂度 + - 平均空间复杂度:所有可能输入实例在同等概率出现的情况下,算法的期望运行时间 + - 最好空间复杂度:最好的情况下,算法的时间复杂度 - - 空间复杂度S(n) + - 空间复杂度S(n) - - 用来定义算法运行过程中需要耗费的存储空间 - - 渐进空间复杂度也被称为空间复杂度 + - 用来定义算法运行过程中需要耗费的存储空间 + - 渐进空间复杂度也被称为空间复杂度 记作:S(n)=O(g(n)) ## 线性表 @@ -155,369 +154,368 @@ - 基本概念 - - 定义:线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列 - - 逻辑特性 + - 定义:线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列 + - 逻辑特性 - - 除表头元素外,线性表中每个元素有且仅有一个 - - 除表尾元素外,线性表中每个元素有且仅有一个直接后继 + - 除表头元素外,线性表中每个元素有且仅有一个 + - 除表尾元素外,线性表中每个元素有且仅有一个直接后继 - - 基本特点 + - 基本特点 - - 元素个数有限 - - 逻辑上具有顺序性 - - 每个元素都是单个元素 - - 数据类型都相同,元素存储空间大小一致 - - 元素具有抽象性,只讨论逻辑关系 + - 元素个数有限 + - 逻辑上具有顺序性 + - 每个元素都是单个元素 + - 数据类型都相同,元素存储空间大小一致 + - 元素具有抽象性,只讨论逻辑关系 - 基本操作 - - InitList(&L): 初始化表。构造空的线性表 - - Length(L):获取表的长度。返回线性表L的长度,即表中的数据元素个数 - - LocateElem(L,e):按值查找操作。在表L中国查找具有给定关键字的元素 - - GetElem(L,i):按位查找操作。获取表中第i个位置的元素的值 - - ListInsert(&L,i,e):插入操作。在表的第i个位置上插入指定元素e - - ListDelete(&L,i,&e):删除操作。删除表中第i个位置的元素,并用e返回删除元素的值 - - PrintList(L):输出操作。按照前后顺序(如:1、2....n)输出线性表的所有元素值 - - Empty(L):判空操作。当表L为空,则返回true,否则返回false - - DestoryList(&L):销毁操作。将线性表销毁,释放线性表L所占用的内存空间 + - InitList(&L): 初始化表。构造空的线性表 + - Length(L):获取表的长度。返回线性表L的长度,即表中的数据元素个数 + - LocateElem(L,e):按值查找操作。在表L中国查找具有给定关键字的元素 + - GetElem(L,i):按位查找操作。获取表中第i个位置的元素的值 + - ListInsert(&L,i,e):插入操作。在表的第i个位置上插入指定元素e + - ListDelete(&L,i,&e):删除操作。删除表中第i个位置的元素,并用e返回删除元素的值 + - PrintList(L):输出操作。按照前后顺序(如:1、2....n)输出线性表的所有元素值 + - Empty(L):判空操作。当表L为空,则返回true,否则返回false + - DestoryList(&L):销毁操作。将线性表销毁,释放线性表L所占用的内存空间 ### 顺序表示 - 基础概念 - - 定义 + - 定义 - - 顺序表:顺序存储的线性表 - - 顺序表中的元素的逻辑顺序与实际的物理位置相同 - - 线性表中的元素的位序是从1开始的,数组中的元素的下标是从0开始的 + - 顺序表:顺序存储的线性表 + - 顺序表中的元素的逻辑顺序与实际的物理位置相同 + - 线性表中的元素的位序是从1开始的,数组中的元素的下标是从0开始的 - - 存储分配 + - 存储分配 - - 静态分配:数组的大小和空间都是实现确定好的,一旦存储空间占满就会产生溢出,直接导致程序崩溃 - - 动态分配:存储数据的空间在程序执行过程中通过动态存储分配语句分配的,即便是数据空间占满,也可以另外开辟一块更大的空间,来替换原来的存储空间 - - malloc()函数: 指针型函数,返回的指针指向该分配域的开头的位置。作用是在内存的动态存储区中分配一个长度为size的连续空间 - - 动态分配不是链式存储,而是属于顺序存储结构,动态分配的物理结构没有改变,依然是随机存取的方式。只是分配的空间大小可以在运行时决定 + - 静态分配:数组的大小和空间都是实现确定好的,一旦存储空间占满就会产生溢出,直接导致程序崩溃 + - 动态分配:存储数据的空间在程序执行过程中通过动态存储分配语句分配的,即便是数据空间占满,也可以另外开辟一块更大的空间,来替换原来的存储空间 + - malloc()函数: 指针型函数,返回的指针指向该分配域的开头的位置。作用是在内存的动态存储区中分配一个长度为size的连续空间 + - 动态分配不是链式存储,而是属于顺序存储结构,动态分配的物理结构没有改变,依然是随机存取的方式。只是分配的空间大小可以在运行时决定 - - 重要特点 + - 重要特点 - - 随机访问【重要】 - - 存储密度高 - - 逻辑上相邻的元素物理上也相邻 + - 随机访问【重要】 + - 存储密度高 + - 逻辑上相邻的元素物理上也相邻 - 基本操作 - - 插入元素 + - 插入元素 - - 在顺序表L的第i(1≤i≤L.length+1)个位置插入新元素,成功返回true,失败返回false - - 时间复杂度 + - 在顺序表L的第i(1≤i≤L.length+1)个位置插入新元素,成功返回true,失败返回false + - 时间复杂度 - - 最好情况:在表尾插入,元素向后移动循环没有执行,时间复杂度O(1); - - 最坏情况:在表头插入,元素后移循环执行n次,时间复杂度为O(n); - - 平均情况:随机插入,平均次数为:n/2,对应的平均复杂度为O(n); + - 最好情况:在表尾插入,元素向后移动循环没有执行,时间复杂度O(1); + - 最坏情况:在表头插入,元素后移循环执行n次,时间复杂度为O(n); + - 平均情况:随机插入,平均次数为:n/2,对应的平均复杂度为O(n); - - 平均时间复杂度为:O(n) + - 平均时间复杂度为:O(n) - - 删除元素 + - 删除元素 - - 删除顺序表L中第i(1≤i≤L.length+1)个位置的元素。成功则返回true,将被删除的元素用引用变量返回,失败则返回false - - 时间复杂度 + - 删除顺序表L中第i(1≤i≤L.length+1)个位置的元素。成功则返回true,将被删除的元素用引用变量返回,失败则返回false + - 时间复杂度 - - 最好情况:删除表尾元素,不需要移动任何元素,时间复杂度为O(1); - - 最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为O(n) - - 平均情况:随机删除,平均需要(n-1)/2,对应的时间复杂度为O(n) + - 最好情况:删除表尾元素,不需要移动任何元素,时间复杂度为O(1); + - 最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为O(n) + - 平均情况:随机删除,平均需要(n-1)/2,对应的时间复杂度为O(n) - - 平均时间复杂度为O(n) + - 平均时间复杂度为O(n) - - 按值查找(顺序查找) + - 按值查找(顺序查找) - - 在顺序表L中查找第一个元素值等于e的元素查找成功返回该元素位序(不是角标),查找失败返回0 - - 位序(个人理解):元素在线性表中的位置序号,角标为i(角标从0开始),对应的位序为i+1(位序从1开始)。当返回为0时,则直接代表没有命中 - - 时间复杂度 + - 在顺序表L中查找第一个元素值等于e的元素查找成功返回该元素位序(不是角标),查找失败返回0 + - 位序(个人理解):元素在线性表中的位置序号,角标为i(角标从0开始),对应的位序为i+1(位序从1开始)。当返回为0时,则直接代表没有命中 + - 时间复杂度 - - 最好情况:查找的元素在表头,只需要比较一次,循环成本最小,时间复杂度为O(1); - - 最坏情况:查找的元素在表尾或者不存在,需要完整遍历,比较n次,时间复杂度为O(n); - - 平均情况:随机查找表上的第i个(1≤i≤L.length)元素,平均次数为(n+1)/2,对应时间复杂度为O(n) + - 最好情况:查找的元素在表头,只需要比较一次,循环成本最小,时间复杂度为O(1); + - 最坏情况:查找的元素在表尾或者不存在,需要完整遍历,比较n次,时间复杂度为O(n); + - 平均情况:随机查找表上的第i个(1≤i≤L.length)元素,平均次数为(n+1)/2,对应时间复杂度为O(n) - - 平均时间复杂度为O(n) + - 平均时间复杂度为O(n) ### 链式表示 - 基础理解 - - 链式存储线性表时,不需要使用连续的存储单元,不要求逻辑上相邻的两个元素在物理位置上也相邻 - - 链式存储线性表时,对线性表的插入、删除元素是不需要移动元素的,只是需要修改指针 - - 理解“链”的含义,链条--->捆绑、指向------>指针 + - 链式存储线性表时,不需要使用连续的存储单元,不要求逻辑上相邻的两个元素在物理位置上也相邻 + - 链式存储线性表时,对线性表的插入、删除元素是不需要移动元素的,只是需要修改指针 + - 理解“链”的含义,链条--->捆绑、指向------>指针 - 单链表 - - 定义:线性表的链式存储称作单链表,通过一组任意的存储单元来存储线性表中的数据元素。 - - 每个链表结点(node)除了存放元素自身的信息外,还需要存放一个指向其后继结点的指针。通过指针建立起链表元素之间的线性关系 - - 单链表可以解决顺序表需要大量连续存储空间的缺点,但是单链表在数据域的基础上附加了指针域,存在浪费存储空间的缺点 - - 单链表的元素是离散地分布在存储空间中的,不能直接找到表中特定的结点,需要从头开始遍历、一次查找【单链表是非随机存取的存储结构】 - - 头结点相关 + - 定义:线性表的链式存储称作单链表,通过一组任意的存储单元来存储线性表中的数据元素。 + - 每个链表结点(node)除了存放元素自身的信息外,还需要存放一个指向其后继结点的指针。通过指针建立起链表元素之间的线性关系 + - 单链表可以解决顺序表需要大量连续存储空间的缺点,但是单链表在数据域的基础上附加了指针域,存在浪费存储空间的缺点 + - 单链表的元素是离散地分布在存储空间中的,不能直接找到表中特定的结点,需要从头开始遍历、一次查找【单链表是非随机存取的存储结构】 + - 头结点相关 - - 定义:为了操作上的方便,在单链表第一个结点之前附加一个结点,叫做头结点。 - - 基本特点 + - 定义:为了操作上的方便,在单链表第一个结点之前附加一个结点,叫做头结点。 + - 基本特点 - - 不论单链表是否带头结点【可选】,头指针始终指向链表的第一个结点 - - 头结点的指针域指向线性表的第一个元素结点 - - 头结点的数据域可以不存任何信息、也可以记录表长等基础信息 - - 头结点是带头结点的链表中的第一个结点 + - 不论单链表是否带头结点【可选】,头指针始终指向链表的第一个结点 + - 头结点的指针域指向线性表的第一个元素结点 + - 头结点的数据域可以不存任何信息、也可以记录表长等基础信息 + - 头结点是带头结点的链表中的第一个结点 - - 优点 + - 优点 - - 因为开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表的其他位置上的操作一致,不需要进行特殊处理 - - 无论链表是否为空,头指针始终是指向头结点的头结点的非空指针 - - 头结点的引入,很好的统一了空表和非空表的操作,有效避免头指针空指针异常问题 + - 因为开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表的其他位置上的操作一致,不需要进行特殊处理 + - 无论链表是否为空,头指针始终是指向头结点的头结点的非空指针 + - 头结点的引入,很好的统一了空表和非空表的操作,有效避免头指针空指针异常问题 - - 基本操作 + - 基本操作 - - 链表创建 + - 链表创建 - - 头插法 + - 头插法 - - 定义:从空表开始,生成新的结点,将读取的数据存放在新结点的数据域中,将新结点插入到当前链表的表头【头结点之后】 - - 读入数据的顺序与生成的链表中的元素顺序是相反的 - - 每个结点插入的时间复杂度为O(1),单链表长度为n时,头插法的时间复杂度为O(n) + - 定义:从空表开始,生成新的结点,将读取的数据存放在新结点的数据域中,将新结点插入到当前链表的表头【头结点之后】 + - 读入数据的顺序与生成的链表中的元素顺序是相反的 + - 每个结点插入的时间复杂度为O(1),单链表长度为n时,头插法的时间复杂度为O(n) - - 尾插法 + - 尾插法 - - 定义:新结点插入到当前链表的表尾上,必须增加一个尾指针r,始终指向当前链表的尾结点 - - 读入数据的顺序与生成的链表中的元素顺序完全一致 - - 每个结点插入的时间复杂度为O(1),单链表长度为n时,尾巴插法的时间复杂度为O(n) - - 相比头插法附设了一个指向表尾结点的指针,但时间复杂度与头插法相同 + - 定义:新结点插入到当前链表的表尾上,必须增加一个尾指针r,始终指向当前链表的尾结点 + - 读入数据的顺序与生成的链表中的元素顺序完全一致 + - 每个结点插入的时间复杂度为O(1),单链表长度为n时,尾巴插法的时间复杂度为O(n) + - 相比头插法附设了一个指向表尾结点的指针,但时间复杂度与头插法相同 - - 按序号查找 + - 按序号查找 - - 定义:在单链表中从第一个结点出发,顺指针next域逐个往下搜索、遍历,直到找出第i个结点为止,否则返回最后一个结点指针域NULL - - 时间复杂度为:O(n) + - 定义:在单链表中从第一个结点出发,顺指针next域逐个往下搜索、遍历,直到找出第i个结点为止,否则返回最后一个结点指针域NULL + - 时间复杂度为:O(n) - - 按值查找 + - 按值查找 - - 定义:从单链表的第一个结点开始,从前往后依次比较表中个结点数据域的值,等于给定值e,则返回该结点的指针;若整个单链表【遍历完】中没有数据域值为e的结点,则返回NULL; - - 时间复杂度为:O(n) + - 定义:从单链表的第一个结点开始,从前往后依次比较表中个结点数据域的值,等于给定值e,则返回该结点的指针;若整个单链表【遍历完】中没有数据域值为e的结点,则返回NULL; + - 时间复杂度为:O(n) - - 插入结点 + - 插入结点 - - 定义:单链表中,将值为x的新结点插入到单链表的第i个位置上 - - 基本步骤 + - 定义:单链表中,将值为x的新结点插入到单链表的第i个位置上 + - 基本步骤 - - 第一步: 检查插入位置的合法性; - - 第二步: 找到待插入位置的前驱结点,即第(i-1)个结点; - - 第三部: 在前驱结点后插入新结点; - - 过程不能更换,避免后继指针不存在的问题 + - 第一步: 检查插入位置的合法性; + - 第二步: 找到待插入位置的前驱结点,即第(i-1)个结点; + - 第三部: 在前驱结点后插入新结点; + - 过程不能更换,避免后继指针不存在的问题 - - 时间复杂度 + - 时间复杂度 - - 插入结点的时间复杂度集中在查找第(i-1)个元素,时间复杂度为O(n) - - 如果在给定结点的后面插入新结点,只需要执行p->next=s操作,时间复杂度为O(1) + - 插入结点的时间复杂度集中在查找第(i-1)个元素,时间复杂度为O(n) + - 如果在给定结点的后面插入新结点,只需要执行p->next=s操作,时间复杂度为O(1) - - 前插操作:在某结点的前面插入一个新的结点 - - 后插操作:在某结点的后面插入一个新的结点,单链表插入算法中,通常采用后插操作的 - - 对结点的前插操作都可以转化为后插操作,前提:需要从单链表的头结点开始顺序查找到其前驱结点;时间复杂度为O(n)。 + - 前插操作:在某结点的前面插入一个新的结点 + - 后插操作:在某结点的后面插入一个新的结点,单链表插入算法中,通常采用后插操作的 + - 对结点的前插操作都可以转化为后插操作,前提:需要从单链表的头结点开始顺序查找到其前驱结点;时间复杂度为O(n)。 - - 删除结点 + - 删除结点 - - 定义:将单链表L的第i个结点元素删除; - - 基本步骤 + - 定义:将单链表L的第i个结点元素删除; + - 基本步骤 - - 第一步: 先检查删除位置的合法性; - - 第二步: 查找表中的第(i-1)个结点,即被删结点的前驱结点; - - 第三步: 移动指针,删除结点元素; + - 第一步: 先检查删除位置的合法性; + - 第二步: 查找表中的第(i-1)个结点,即被删结点的前驱结点; + - 第三步: 移动指针,删除结点元素; - - 和插入算法一样,时间都消耗在查询前驱结点上,时间复杂度为:O(n) - - 利用p结点的后继结点将p结点删除【经典思路】 + - 和插入算法一样,时间都消耗在查询前驱结点上,时间复杂度为:O(n) + - 利用p结点的后继结点将p结点删除【经典思路】 - - 第一步:申请结点q,使其只想p结点的后继结点; - - 第二步:将p结点的数据域值换成其后继结点的数据域;【注意,交换没什么意义,最终p的后继结点会删除、释放】 - - 第三步:p的指针域指向q的指针域,q结点从链中“断开” - - 第四步:释放q的内存空间 - - 相比按值查找前驱结点来删除给定的结点p,利用后继结点来删除的时间复杂度更小,为:O(1) + - 第一步:申请结点q,使其只想p结点的后继结点; + - 第二步:将p结点的数据域值换成其后继结点的数据域;【注意,交换没什么意义,最终p的后继结点会删除、释放】 + - 第三步:p的指针域指向q的指针域,q结点从链中“断开” + - 第四步:释放q的内存空间 + - 相比按值查找前驱结点来删除给定的结点p,利用后继结点来删除的时间复杂度更小,为:O(1) + - 计算表长(遍历) - - 计算表长(遍历) + - 定义:计算单链表中数据结点(不含头结点)的个数 + - 算法思路:从第一个结点开始顺序依次访问表中的每一个结点,为此需要设置一个`计数器变量`,每访问一个结点,计算器加1,直到访问到空结点为止。 + - 时间复杂度:O(n) + - 判空条件 - - 定义:计算单链表中数据结点(不含头结点)的个数 - - 算法思路:从第一个结点开始顺序依次访问表中的每一个结点,为此需要设置一个`计数器变量`,每访问一个结点,计算器加1,直到访问到空结点为止。 - - 时间复杂度:O(n) - - 判空条件 - - - 不带头结点的单链表L为空,判定条件是L=NULL。 - - 带头结点的单链表L为空,判空条件:L->next=NULL + - 不带头结点的单链表L为空,判定条件是L=NULL。 + - 带头结点的单链表L为空,判空条件:L->next=NULL - 双链表 - - 定义:在单链表的结点中增加了一个指向结点前驱的`prior`指针,由prior指针域、data数据域、next指针域三部分组成。 - - 基本特点 + - 定义:在单链表的结点中增加了一个指向结点前驱的`prior`指针,由prior指针域、data数据域、next指针域三部分组成。 + - 基本特点 - - 双链表仅仅在单链表的结点中增加了一个指向结点前驱的prior指针 - - 按值查找、按序号查找在单链表和双链表上的操作是相同的 - - 和单链表不同,插入、删除操作除了修改next指针域,双链表还需要修改prior指针域,确保不断`链`【重要】 + - 双链表仅仅在单链表的结点中增加了一个指向结点前驱的prior指针 + - 按值查找、按序号查找在单链表和双链表上的操作是相同的 + - 和单链表不同,插入、删除操作除了修改next指针域,双链表还需要修改prior指针域,确保不断`链`【重要】 - - 基本操作 + - 基本操作 - - 插入结点 + - 插入结点 - - 第一步:s->next=p->next - - 第二步:p->next-prior=s - - 第三步:s->prior=p - - 第四步:p->next=s - - 时间复杂度:O(1) - - 注意:结点p和s的前驱、后继指针要关联清楚,第一二步必须在第四步之前完成【重要】 + - 第一步:s->next=p->next + - 第二步:p->next-prior=s + - 第三步:s->prior=p + - 第四步:p->next=s + - 时间复杂度:O(1) + - 注意:结点p和s的前驱、后继指针要关联清楚,第一二步必须在第四步之前完成【重要】 - - 删除结点 + - 删除结点 - - 第一步:p->next=q->next - - 第二步:q->next->prior=p - - 第三步:free(q) 释放结点内存空间 - - 时间复杂度:O(1) - - 注意:删除双链表结点p的后继结点的第一二步,顺序可换,及时释放内存空间【重要】 + - 第一步:p->next=q->next + - 第二步:q->next->prior=p + - 第三步:free(q) 释放结点内存空间 + - 时间复杂度:O(1) + - 注意:删除双链表结点p的后继结点的第一二步,顺序可换,及时释放内存空间【重要】 - 循环链表 - - 循环单链表 + - 循环单链表 - - 定义:在单链表的基础上,将最后一个结点(尾结点)的指针由`NULL`改为指向`头结点`,形成`环`。【单链表----->循环单链表】 - - 判断条件 + - 定义:在单链表的基础上,将最后一个结点(尾结点)的指针由`NULL`改为指向`头结点`,形成`环`。【单链表----->循环单链表】 + - 判断条件 - - 不是判断头结点的指针是否为空,而是需要判断是否等于头指针 - - 表为空时,头结点的next指针域其实是指向自己 - - 结点的next指针指向自己,也就能判断表为空 + - 不是判断头结点的指针是否为空,而是需要判断是否等于头指针 + - 表为空时,头结点的next指针域其实是指向自己 + - 结点的next指针指向自己,也就能判断表为空 - - 基本特点 + - 基本特点 - - 在循环单链表中,尾结点*p的next指针域指向链表L(即:头结点),形成了`闭环`,不存在指针域为`NULL`的结点 - - 由于循环单链表是个`环`,在任何位置上的插入、删除操作都是等价的,不需要去判断是否是表尾 - - 单链表只能从头结点(表头结点)开始往后顺序遍历整个表,循环单链表可以从表中任意位置开始遍历整个链表,结点是等价的 - - 循环单链表可以抽象为时钟,形成的`环`是有顺序的 - - 频繁的`表头`和`表尾`操作,可以对循环单链表设置`尾指针`,而不设置`头指针`,明确尾指针r后,头指针即为:`r->next` ,减少头指针到尾指针间的遍历,时间复杂度:O(n)---->O(1) + - 在循环单链表中,尾结点*p的next指针域指向链表L(即:头结点),形成了`闭环`,不存在指针域为`NULL`的结点 + - 由于循环单链表是个`环`,在任何位置上的插入、删除操作都是等价的,不需要去判断是否是表尾 + - 单链表只能从头结点(表头结点)开始往后顺序遍历整个表,循环单链表可以从表中任意位置开始遍历整个链表,结点是等价的 + - 循环单链表可以抽象为时钟,形成的`环`是有顺序的 + - 频繁的`表头`和`表尾`操作,可以对循环单链表设置`尾指针`,而不设置`头指针`,明确尾指针r后,头指针即为:`r->next` ,减少头指针到尾指针间的遍历,时间复杂度:O(n)---->O(1) - - 循环双链表 + - 循环双链表 - - 定义:在双链表的基础上,将尾结点的next指针指向头结点,将头结点的prior指针指向尾结点。【双链表----->循环双链表】 - - 判空条件 + - 定义:在双链表的基础上,将尾结点的next指针指向头结点,将头结点的prior指针指向尾结点。【双链表----->循环双链表】 + - 判空条件 - - 循环双链表为空时,头结点*p的prior指针和next指针都指向L - - 同时满足 + - 循环双链表为空时,头结点*p的prior指针和next指针都指向L + - 同时满足 - - p->prior=L - - p->next=L + - p->prior=L + - p->next=L - - 基本特点:从双向链表中的任意一个结点开始,都可以很方便地访问它的`前驱结点`和`后继结点` + - 基本特点:从双向链表中的任意一个结点开始,都可以很方便地访问它的`前驱结点`和`后继结点` - 静态链表 - - 定义:借助数组来描述线性表的链式存储结构,结点元素同样存在数据域`data`和指针域`next` - - 需要注意 + - 定义:借助数组来描述线性表的链式存储结构,结点元素同样存在数据域`data`和指针域`next` + - 需要注意 - - 和普通的链表的指针域不同的是,静态链表的指针是结点元素的相对地址(数组下标),也称为`游标`,建议结合高级语言中数组的概念来理解; - - 与顺序表一样,虽然静态链表属于链表,但是存储时需要预先分配一块连续的内存空间 - - 静态链表是通过`数组游标`来访问下一个结点元素 + - 和普通的链表的指针域不同的是,静态链表的指针是结点元素的相对地址(数组下标),也称为`游标`,建议结合高级语言中数组的概念来理解; + - 与顺序表一样,虽然静态链表属于链表,但是存储时需要预先分配一块连续的内存空间 + - 静态链表是通过`数组游标`来访问下一个结点元素 - - 特点 + - 特点 - - 静态链表以`next=-1`作为结束的标志【尾结点】 - - 和动态链表相同,插入、删除操作不需要移动元素,只需要修改指针; - - 总体来说,静态链表没有单链表使用方便,需要将整个链表存储在一块连续的内存空间中,内部的存储可以分散,通过指针构成`链`的关系 + - 静态链表以`next=-1`作为结束的标志【尾结点】 + - 和动态链表相同,插入、删除操作不需要移动元素,只需要修改指针; + - 总体来说,静态链表没有单链表使用方便,需要将整个链表存储在一块连续的内存空间中,内部的存储可以分散,通过指针构成`链`的关系 - 零碎知识补充 - - 无论是链表的插入还是删除操作,必须保证不断链【重要】 - - 顺序存储结构可以随机存取也能顺序存取,链式结构只能进行顺序存取 - - 顺序存储方式同样适合图和树的存储,例如:满二叉树的顺序存储 - - 队列需要在表头删除元素,在表尾插入元素【先进先出】,采用带尾指针的循环单链表比较方便 - - 静态链表中的指针称为`游标`,指示下一个元素在数组中的`下标` - - 静态链表用数组表示,需要预先分配较大的连续空间,同时具有一般链表的特点(插入、删除元素不需要移动元素) - - 单链表设置头结点的 + - 无论是链表的插入还是删除操作,必须保证不断链【重要】 + - 顺序存储结构可以随机存取也能顺序存取,链式结构只能进行顺序存取 + - 顺序存储方式同样适合图和树的存储,例如:满二叉树的顺序存储 + - 队列需要在表头删除元素,在表尾插入元素【先进先出】,采用带尾指针的循环单链表比较方便 + - 静态链表中的指针称为`游标`,指示下一个元素在数组中的`下标` + - 静态链表用数组表示,需要预先分配较大的连续空间,同时具有一般链表的特点(插入、删除元素不需要移动元素) + - 单链表设置头结点的 - - 目的:方便运算 - - 好处 + - 目的:方便运算 + - 好处 - - 有头结点后,插入、删除数据元素的算法统一起来了,不需要判断是否在第一个元素之前插入或者删除第一个元素了 - - 不论链表是否为空,头指针是指向头结点的`非空指针`,链表的头指针不变,因此空链表和非空链表的处理也就统一起来了。 + - 有头结点后,插入、删除数据元素的算法统一起来了,不需要判断是否在第一个元素之前插入或者删除第一个元素了 + - 不论链表是否为空,头指针是指向头结点的`非空指针`,链表的头指针不变,因此空链表和非空链表的处理也就统一起来了。 ### 顺序表和链表的比较 - 存取方式 - - 顺序表支持顺序存取和随机存取 - - 链表只能从表头顺序存取元素,支持顺序存取 + - 顺序表支持顺序存取和随机存取 + - 链表只能从表头顺序存取元素,支持顺序存取 - 逻辑结构与物理结构 - - 顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻【一定性】 - - 链式存储时,逻辑上相邻的元素,对应的物理存储位置不一定相邻【可以相邻,也可以不相邻】 - - 链式存储的逻辑关系通过指针链接表示 + - 顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻【一定性】 + - 链式存储时,逻辑上相邻的元素,对应的物理存储位置不一定相邻【可以相邻,也可以不相邻】 + - 链式存储的逻辑关系通过指针链接表示 - 时间复杂度 - - 按值查找 + - 按值查找 - - 顺序表无序的情况下,顺序表和链表的时间复杂度均为O(n); - - 顺序表有序的情况下,顺序表的时间复杂度为O(log2n),链表为O(n); + - 顺序表无序的情况下,顺序表和链表的时间复杂度均为O(n); + - 顺序表有序的情况下,顺序表的时间复杂度为O(log2n),链表为O(n); - - 按序号查找 + - 按序号查找 - - 顺序表支持随机访问,时间复杂度为O(1); - - 顺序表不支持随机访问,时间复杂度为O(n); + - 顺序表支持随机访问,时间复杂度为O(1); + - 顺序表不支持随机访问,时间复杂度为O(n); - - 插入、删除 + - 插入、删除 - - 顺序表平均需要移动半个表长的元素; - - 链表只需要修改相应结点的指针域,不需要移动元素; - - 链表结点除了数据域,还有指针域,在存储空间上比顺序存储需要更大的存储空间,付出更大的存储代价,存储密度不够大 + - 顺序表平均需要移动半个表长的元素; + - 链表只需要修改相应结点的指针域,不需要移动元素; + - 链表结点除了数据域,还有指针域,在存储空间上比顺序存储需要更大的存储空间,付出更大的存储代价,存储密度不够大 - 空间分配 - - 顺序存储 + - 顺序存储 - - 静态分配 + - 静态分配 - - 需要预先分配足够大的存储空间 - - 空间装满后不能扩充,存储新元素将出现`内存溢出` - - 存储空间过大,顺序表后部闲置空间过多,造成`内部碎片` - - 存储空间过小,会造成`内存溢出` + - 需要预先分配足够大的存储空间 + - 空间装满后不能扩充,存储新元素将出现`内存溢出` + - 存储空间过大,顺序表后部闲置空间过多,造成`内部碎片` + - 存储空间过小,会造成`内存溢出` - - 动态分配 + - 动态分配 - - 能够扩充存储空间 - - 需要移动大量元素,操作效率降低 - - 内存中没有更大块的连续存储空间,将会导致空间分配失败; + - 能够扩充存储空间 + - 需要移动大量元素,操作效率降低 + - 内存中没有更大块的连续存储空间,将会导致空间分配失败; - - 链式存储 + - 链式存储 - - 结点空间只在需要的时候申请分配 - - 只要内存由空间就可以分配,操作灵活、高效 + - 结点空间只在需要的时候申请分配 + - 只要内存由空间就可以分配,操作灵活、高效 ### 存储结构选取 - 基于存储的考虑 - - 对线性表的长度和存储规模难以估计时,不宜采用顺序表存储 - - 链表不用事先估计存储规模,但存储密度较低 - - 链式存储结构的存储密度小于1,不要求连续的存储空间 + - 对线性表的长度和存储规模难以估计时,不宜采用顺序表存储 + - 链表不用事先估计存储规模,但存储密度较低 + - 链式存储结构的存储密度小于1,不要求连续的存储空间 - 基于运算的考虑 - - 随机存取 + - 随机存取 - - 顺序表支持随机存取,按序号查找顺序表的时间复杂度为O(1),相对较好 - - 链表不支持随机存取,按序号查找链表的时间复杂度为O(n) + - 顺序表支持随机存取,按序号查找顺序表的时间复杂度为O(1),相对较好 + - 链表不支持随机存取,按序号查找链表的时间复杂度为O(n) - - 插入、删除操作 + - 插入、删除操作 - - 顺序表的插入、删除操作,平均需要移动表中一半的元素,当表的数据量较大时,这种情况需要重点考虑的 - - 链表的插入、删除操作,也是需要找插入位置(前驱结点、后继结点),主要的操作还是比较操作,相对较好 + - 顺序表的插入、删除操作,平均需要移动表中一半的元素,当表的数据量较大时,这种情况需要重点考虑的 + - 链表的插入、删除操作,也是需要找插入位置(前驱结点、后继结点),主要的操作还是比较操作,相对较好 - 基于环境的考虑 - - 顺序表容易实现,任何高级语言中都有数组类型 - - 链表操作是基于指针的,指针移动,相对复杂 + - 顺序表容易实现,任何高级语言中都有数组类型 + - 链表操作是基于指针的,指针移动,相对复杂 - 综合结论 - - 通常比较稳定的线性表选择顺序存储 - - 频繁进行插入、删除操作的线性表,应该选择链式存储,动态性较强 + - 通常比较稳定的线性表选择顺序存储 + - 频繁进行插入、删除操作的线性表,应该选择链式存储,动态性较强 ## 栈和队列 @@ -525,236 +523,236 @@ - 基础概念 - - 定义: 只允许在一端进行插入或者删除操作的线性表。 + - 定义: 只允许在一端进行插入或者删除操作的线性表。 - - 后进先出 - - 明确栈是一种线性表 - - 限定栈只能在某一端进行插入或者删除操作 + - 后进先出 + - 明确栈是一种线性表 + - 限定栈只能在某一端进行插入或者删除操作 - - 栈顶:线性表允许进行插入和删除的一端 - - 栈底:不允许进行插入和删除的另外一端,是固定的 - - 空栈:不含任何元素的空表,也叫栈空 + - 栈顶:线性表允许进行插入和删除的一端 + - 栈底:不允许进行插入和删除的另外一端,是固定的 + - 空栈:不含任何元素的空表,也叫栈空 - 基本操作 - - InitStack(&S): 初始化一个空栈S,栈顶指针初始化为-1 - - StackEmpty(S): 判断一个栈是否为空,如果栈空则返回true,否则返回false - - Push(&S,x): 进栈,若栈未满,x进栈操作,插入到栈内成为新的栈顶元素 - - Pop(&S,&x): 出栈,若栈非空,出栈操作,弹出栈顶元素,用指针x进行返回 - - GetTop(S,&x): 读栈顶元素,若栈S非空,用x返回栈顶元素 - - ClearStack(&S): 销毁栈,释放栈S占用的存储空间 + - InitStack(&S): 初始化一个空栈S,栈顶指针初始化为-1 + - StackEmpty(S): 判断一个栈是否为空,如果栈空则返回true,否则返回false + - Push(&S,x): 进栈,若栈未满,x进栈操作,插入到栈内成为新的栈顶元素 + - Pop(&S,&x): 出栈,若栈非空,出栈操作,弹出栈顶元素,用指针x进行返回 + - GetTop(S,&x): 读栈顶元素,若栈S非空,用x返回栈顶元素 + - ClearStack(&S): 销毁栈,释放栈S占用的存储空间 - 顺序存储结构 - - 顺序栈 + - 顺序栈 - - 定义:栈的顺序存储,利用一组地址连续的存储单元存放自栈底到栈顶的所有元素,同时**附加一个用来指向当前栈顶位置的指针** - - 顺序栈S【重要,栈顶指针初始化为-1】 + - 定义:栈的顺序存储,利用一组地址连续的存储单元存放自栈底到栈顶的所有元素,同时**附加一个用来指向当前栈顶位置的指针** + - 顺序栈S【重要,栈顶指针初始化为-1】 - - 栈顶指针S.top + - 栈顶指针S.top - - 初始时,S.top=-1 - - 栈顶元素:S.data[S.top] + - 初始时,S.top=-1 + - 栈顶元素:S.data[S.top] - - 进栈操作:栈不满时,栈顶+1,再进栈 - - 出栈操作:栈非空时,取栈顶元素,栈顶-1 - - 栈满条件:S.top=MaxSize-1 - - 栈空条件:S.top=-1 - - 栈长:S.top+1 - - 当对栈的最大使用空间估计不足时,容易出现栈上溢(外溢),需要主动向用户报告反馈,避免出现错误; + - 进栈操作:栈不满时,栈顶+1,再进栈 + - 出栈操作:栈非空时,取栈顶元素,栈顶-1 + - 栈满条件:S.top=MaxSize-1 + - 栈空条件:S.top=-1 + - 栈长:S.top+1 + - 当对栈的最大使用空间估计不足时,容易出现栈上溢(外溢),需要主动向用户报告反馈,避免出现错误; - - 栈顶指针初始化为0【更多是为-1】 + - 栈顶指针初始化为0【更多是为-1】 - - 入栈: `S.data[S.top++]=x` - - 出栈: `x=S.data[--S.top]` - - 同时, 栈空、栈满条件也会有变化 + - 入栈: `S.data[S.top++]=x` + - 出栈: `x=S.data[--S.top]` + - 同时, 栈空、栈满条件也会有变化 - - 基本运算 + - 基本运算 - - `InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1 - - `StackEmpty(S)`: 判断一个栈是否为空,即:栈顶指针是否为-1,如果栈空则返回`true`,否则返回`false` - - `Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。 - - `Pop(&S,&x)`: 出栈,若栈非空,出栈操作,**弹出栈顶元素**,用指针`x`进行返回。 - - `GetTop(S,&x)`: 读(获取)栈顶元素,若栈`S`非空,用x返回栈顶元素。 + - `InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1 + - `StackEmpty(S)`: 判断一个栈是否为空,即:栈顶指针是否为-1,如果栈空则返回`true`,否则返回`false` + - `Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。 + - `Pop(&S,&x)`: 出栈,若栈非空,出栈操作,**弹出栈顶元素**,用指针`x`进行返回。 + - `GetTop(S,&x)`: 读(获取)栈顶元素,若栈`S`非空,用x返回栈顶元素。 - - 共享栈 + - 共享栈 - - 定义:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个`一维存储空间`,将两个栈的栈底分别设置在共享空间的两端,两个栈顶则向共享空间的中间延伸 - - 基础概念 + - 定义:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个`一维存储空间`,将两个栈的栈底分别设置在共享空间的两端,两个栈顶则向共享空间的中间延伸 + - 基础概念 - - 两个栈(0、1号顺序栈)的栈顶指针都指向栈顶元素 - - 0号栈栈顶指针`top=-1`时,0号栈为空 - - 1号栈栈顶指针`top=MaxSize`时,1号栈为空 - - 当且仅当两个栈的栈顶指针相邻(`top1-top0=1`),可以判断共享栈栈满 + - 两个栈(0、1号顺序栈)的栈顶指针都指向栈顶元素 + - 0号栈栈顶指针`top=-1`时,0号栈为空 + - 1号栈栈顶指针`top=MaxSize`时,1号栈为空 + - 当且仅当两个栈的栈顶指针相邻(`top1-top0=1`),可以判断共享栈栈满 - - 进栈【先移动指针,后赋值】 + - 进栈【先移动指针,后赋值】 - - 当0号栈进栈时,0号栈栈顶指针top0`先加1后赋值` - - 当1号栈进栈时,0号栈栈顶指针top1`先减1后赋值` + - 当0号栈进栈时,0号栈栈顶指针top0`先加1后赋值` + - 当1号栈进栈时,0号栈栈顶指针top1`先减1后赋值` - - 出栈【先赋值,后移动指针】 + - 出栈【先赋值,后移动指针】 - - 当0号栈进栈时,0号栈栈顶指针top0`先赋值后减1` - - 当1号栈进栈时,0号栈栈顶指针top1`先赋值后加1` + - 当0号栈进栈时,0号栈栈顶指针top0`先赋值后减1` + - 当1号栈进栈时,0号栈栈顶指针top1`先赋值后加1` - - 重要特性 + - 重要特性 - - 共享栈能够更有效的利用存储空间,两个栈空间进行相互调节 - - 只有当这个存储空间(即:共享空间)被占满时才会发生上溢 - - 共享栈对存取效率没有什么影响,存取数据的时间复杂度都为O(1),在栈顶操作。 + - 共享栈能够更有效的利用存储空间,两个栈空间进行相互调节 + - 只有当这个存储空间(即:共享空间)被占满时才会发生上溢 + - 共享栈对存取效率没有什么影响,存取数据的时间复杂度都为O(1),在栈顶操作。 - 链式存储结构 - - 基本概念 + - 基本概念 - - `链栈`: 采用链式存储的栈 - - `栈满`:对于链栈来说,是基于链式存储的,基本不存在栈满的情况,除非内存已经没有使用空间了 - - `栈空`:对于空栈来说,链表原来的定义是头指针指向空,那么链栈的空其实就是`top=NULL`,链栈元素总数为0 - - 通常对于链栈来说,是不需要头结点的,当然也存在带头结点的链栈 + - `链栈`: 采用链式存储的栈 + - `栈满`:对于链栈来说,是基于链式存储的,基本不存在栈满的情况,除非内存已经没有使用空间了 + - `栈空`:对于空栈来说,链表原来的定义是头指针指向空,那么链栈的空其实就是`top=NULL`,链栈元素总数为0 + - 通常对于链栈来说,是不需要头结点的,当然也存在带头结点的链栈 - - 基础操作【基于单链表】 + - 基础操作【基于单链表】 - - 入栈 + - 入栈 - - 如果链栈不存在,则栈满,入栈操作失败,返回false; - - 如果链栈存在,进行单链表的结点插入操作,移动指针,结点元素赋值,再将结点压入链栈中,移动链栈栈顶指针,最后链栈元素总数+1,返回true + - 如果链栈不存在,则栈满,入栈操作失败,返回false; + - 如果链栈存在,进行单链表的结点插入操作,移动指针,结点元素赋值,再将结点压入链栈中,移动链栈栈顶指针,最后链栈元素总数+1,返回true - - 出栈 + - 出栈 - - 如果链栈不存在,或者为空栈,则无法进行出栈操作,返回false - - 如果链栈满足出栈条件,则通过栈顶指针获取到链栈栈底结点,将其数据域赋值给变量e,移动栈顶指针指向待出栈元素的后继结点,同时释放待出栈元素的内存空间,链栈元素总数-1 ,出栈成功,返回true. + - 如果链栈不存在,或者为空栈,则无法进行出栈操作,返回false + - 如果链栈满足出栈条件,则通过栈顶指针获取到链栈栈底结点,将其数据域赋值给变量e,移动栈顶指针指向待出栈元素的后继结点,同时释放待出栈元素的内存空间,链栈元素总数-1 ,出栈成功,返回true. - - 基于单链表的链栈入栈、出栈操作,时间复杂度都为O(1)【重要】 + - 基于单链表的链栈入栈、出栈操作,时间复杂度都为O(1)【重要】 - - 优点 + - 优点 - - 便于多个栈共享存储空间 - - 不存在栈满上溢的情况,避免程序因溢出导致出错 - - 有效的提高存取效率 + - 便于多个栈共享存储空间 + - 不存在栈满上溢的情况,避免程序因溢出导致出错 + - 有效的提高存取效率 ### 队列【先进先出】 - 基本概念 - - 队列:和栈一样,是一种操作受限制的线性表,只允许在表的一端进行插入,在表的另外一端进行删除,简称为`队`,常记作:`Queue` - - 队头:允许进行删除操作的一端,也叫做`队首`,常记作:`Front` - - 队尾:允许进行插入操作的一端,常记作:`Rear` - - 空队列:不含任何元素的空表,注意这个表是指`线性表` - - 入队: 向队列中插入元素,也叫做`进队` - - 出队: 删除队列元素,也叫做`离队` + - 队列:和栈一样,是一种操作受限制的线性表,只允许在表的一端进行插入,在表的另外一端进行删除,简称为`队`,常记作:`Queue` + - 队头:允许进行删除操作的一端,也叫做`队首`,常记作:`Front` + - 队尾:允许进行插入操作的一端,常记作:`Rear` + - 空队列:不含任何元素的空表,注意这个表是指`线性表` + - 入队: 向队列中插入元素,也叫做`进队` + - 出队: 删除队列元素,也叫做`离队` - 基础操作 - - InitQueue(&Q): 初始化一个队列,构造空队列Q - - `QueueEmpty(Q)`: 判断队列是否为空,队空返回true,否则返回false - - EnEmpty(&Q,x): 入队,如果队列Q未满,将x入队,成为新的队尾元素 - - DeEmpty(&Q,&x): 出队,如果队列Q非空,删除队头元素,复制给x返回 - - GetHead(Q,&x): 读取队头元素,如果队列Q非空,则将队头元素赋值给x + - InitQueue(&Q): 初始化一个队列,构造空队列Q + - `QueueEmpty(Q)`: 判断队列是否为空,队空返回true,否则返回false + - EnEmpty(&Q,x): 入队,如果队列Q未满,将x入队,成为新的队尾元素 + - DeEmpty(&Q,&x): 出队,如果队列Q非空,删除队头元素,复制给x返回 + - GetHead(Q,&x): 读取队头元素,如果队列Q非空,则将队头元素赋值给x - 顺序存储 - - 顺序队列 + - 顺序队列 - - 队列的顺序实现是指分配一块连续的存储单元用来存放队列中的元素,并且附加两个指针 + - 队列的顺序实现是指分配一块连续的存储单元用来存放队列中的元素,并且附加两个指针 - - front指针: 指向队头元素的位置 - - rear指针: 指向队尾元素的位置 + - front指针: 指向队头元素的位置 + - rear指针: 指向队尾元素的位置 - - 初始状态(队空条件):Q.front===Q.rear===0 - - 入队操作:队不满时,先赋值给队尾元素,再移动队尾指针+1 - - 出队操作: 队不空时,先取队头元素值,再移动队头指针+1 - - Q.front===Q.rear===0,那能用Q.rear==MaxSize来表示队满嘛?【不行】 + - 初始状态(队空条件):Q.front===Q.rear===0 + - 入队操作:队不满时,先赋值给队尾元素,再移动队尾指针+1 + - 出队操作: 队不空时,先取队头元素值,再移动队头指针+1 + - Q.front===Q.rear===0,那能用Q.rear==MaxSize来表示队满嘛?【不行】 - - 循环队列 + - 循环队列 - - 把顺序队列臆想为一个环状的空间,将存储队列元素的表从逻辑上看做为一个环 - - 初始时:Q.front=Q.rear=0 - - 队首指针进1: Q.front=(Q.front+1)%MaxSize - - 队尾指针进1: Q.rear=(Q.rear+1)%MaxSize - - 队列长度: (Q.rear+MaxSize-Q.front)%MaxSize - - 除法取余运算(%)【解决顺序队列“上溢出”】问题 - - 如何区别队空还是队满? + - 把顺序队列臆想为一个环状的空间,将存储队列元素的表从逻辑上看做为一个环 + - 初始时:Q.front=Q.rear=0 + - 队首指针进1: Q.front=(Q.front+1)%MaxSize + - 队尾指针进1: Q.rear=(Q.rear+1)%MaxSize + - 队列长度: (Q.rear+MaxSize-Q.front)%MaxSize + - 除法取余运算(%)【解决顺序队列“上溢出”】问题 + - 如何区别队空还是队满? - - 方案一:牺牲一个单元来区分队空和队满 + - 方案一:牺牲一个单元来区分队空和队满 - - 前提:队头指针在队尾指针在队尾指针的下一个位置作为队满标志【重要】 - - 队满条件:(Q.rear+1)%MaxSize==Q.front - - 队空条件:Q.front==Q.rear - - 队列中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize + - 前提:队头指针在队尾指针在队尾指针的下一个位置作为队满标志【重要】 + - 队满条件:(Q.rear+1)%MaxSize==Q.front + - 队空条件:Q.front==Q.rear + - 队列中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize - - 方案二:类型中增设表示元素个数的数据成员 + - 方案二:类型中增设表示元素个数的数据成员 - - 直接和MaxSize去比较 - - 队空条件: Q.count=0 - - 队满条件: Q.count=MaxSize - - 【注意】不论是队空还是队满,对会存在Q.front=Q.rear,这个可以通过前面方案一解决 + - 直接和MaxSize去比较 + - 队空条件: Q.count=0 + - 队满条件: Q.count=MaxSize + - 【注意】不论是队空还是队满,对会存在Q.front=Q.rear,这个可以通过前面方案一解决 - - 方案三:类型中增设tag数据成员标记 + - 方案三:类型中增设tag数据成员标记 - - 通过添加tag标记的方式,区分队空还是队满 - - tag==0的情况下,如果因为删除导致Q.front==Q.rear,则队空; - - tag==1的情况下,如果因为插入导致Q.front==Q.rear,则队满; - - tag的主要作用 + - 通过添加tag标记的方式,区分队空还是队满 + - tag==0的情况下,如果因为删除导致Q.front==Q.rear,则队空; + - tag==1的情况下,如果因为插入导致Q.front==Q.rear,则队满; + - tag的主要作用 - - 在有元素入队的时候,设置tag=1 - - 在有元素出队的时候,设置tag=0 + - 在有元素入队的时候,设置tag=1 + - 在有元素出队的时候,设置tag=0 - 链式存储 - - 链队列 + - 链队列 - - `链队列`:和顺序队列一样,基于队列的链式表示叫做`链队列`,实际上为:**一个同时带有队头指针和队尾指针的单链表** + - `链队列`:和顺序队列一样,基于队列的链式表示叫做`链队列`,实际上为:**一个同时带有队头指针和队尾指针的单链表** - - 头指针指向队头结点 - - 尾指针指向队尾结点(单链表的最后一个结点) + - 头指针指向队头结点 + - 尾指针指向队尾结点(单链表的最后一个结点) - - 不带头结点链式队列 + - 不带头结点链式队列 - - 队空: linkQueue.front==NULL且linkQueue.rear==NULL - - 出队: 先判断队列是否为空,非空队列则取出队头元素,从链表中闪出去,队头指针Q.front指向下一个结点,如果出队的结此为尾结点,出队后队空,需要将Q.front和Q.rear都置为NULL - - 入队: 建立一个新的结点,将新的结点插入到链表的尾部,修改队尾指针Q.rear指向新插入的结点。如果原队列为空,需要将队首指针也指向该结点 - - 【入队、出队操作,都需要考虑队空的情况下的特殊处理,不带头结点的队列导致队空队首和队尾指针都为NULL,麻烦】 + - 队空: linkQueue.front==NULL且linkQueue.rear==NULL + - 出队: 先判断队列是否为空,非空队列则取出队头元素,从链表中闪出去,队头指针Q.front指向下一个结点,如果出队的结此为尾结点,出队后队空,需要将Q.front和Q.rear都置为NULL + - 入队: 建立一个新的结点,将新的结点插入到链表的尾部,修改队尾指针Q.rear指向新插入的结点。如果原队列为空,需要将队首指针也指向该结点 + - 【入队、出队操作,都需要考虑队空的情况下的特殊处理,不带头结点的队列导致队空队首和队尾指针都为NULL,麻烦】 - - 带头结点的链式队列 + - 带头结点的链式队列 - - 【复杂的入队、出队操作就统一起来】 - - 队空:Q.front==Q.rear,都指向头结点,一般数据域可以为空 - - 出队:判断队列是否为空,队列非空则在队首移动指针,将队首指针指向下一个元素。如果队列中就一个元素,则出队后将成为空队,Q.rear==Q.front,最后释放元素内存空间。 - - 入队:将元素插入队尾,移动队尾指针,即便为空队列入队,由于队列带有头结点,此时就很好的避免操作队首指针了。 - - 子主题 5 + - 【复杂的入队、出队操作就统一起来】 + - 队空:Q.front==Q.rear,都指向头结点,一般数据域可以为空 + - 出队:判断队列是否为空,队列非空则在队首移动指针,将队首指针指向下一个元素。如果队列中就一个元素,则出队后将成为空队,Q.rear==Q.front,最后释放元素内存空间。 + - 入队:将元素插入队尾,移动队尾指针,即便为空队列入队,由于队列带有头结点,此时就很好的避免操作队首指针了。 + - 子主题 5 - - 特别注意 + - 特别注意 - - 用单链表表示的链式队列非常适合频繁出队、入队、元素变化大的场景 - - 不存在队满情况,也不会出现溢出情况; - - 链式队列不会出现存储分配不合理、“溢出”的情况,内存动态分配 + - 用单链表表示的链式队列非常适合频繁出队、入队、元素变化大的场景 + - 不存在队满情况,也不会出现溢出情况; + - 链式队列不会出现存储分配不合理、“溢出”的情况,内存动态分配 - - 基本操作【带头结点】 + - 基本操作【带头结点】 - - 队列初始化 - - 判断队空:Q.front==Q.rear - - 入队【重要】 - - 出队【重要】 + - 队列初始化 + - 判断队空:Q.front==Q.rear + - 入队【重要】 + - 出队【重要】 - - 双端队列 + - 双端队列 - - 允许在两端都可以进行入队和出队操作的队列,元素的逻辑结构仍然是线性结构 - - 双端队列的两端分别称为前端和后端,两端都可以入队和出队 + - 允许在两端都可以进行入队和出队操作的队列,元素的逻辑结构仍然是线性结构 + - 双端队列的两端分别称为前端和后端,两端都可以入队和出队 - - 进队:前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在队列前端进的元素后面; - - 出队:无论是前端还是后端出队,先出的的元素排列在后出的元素的前面 + - 进队:前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在队列前端进的元素后面; + - 出队:无论是前端还是后端出队,先出的的元素排列在后出的元素的前面 - - 输入受限的双端队列:允许在一端进行插入和删除操作,但在另外一端只允许进行删除的双端队列 - - 输出受限的双端队列:允许在一端进行插入和删除曹组,但在另外一端只允许进行插入的双端队列 + - 输入受限的双端队列:允许在一端进行插入和删除操作,但在另外一端只允许进行删除的双端队列 + - 输出受限的双端队列:允许在一端进行插入和删除曹组,但在另外一端只允许进行插入的双端队列 - - 如果限定双端队列从某个断点插入的元素只能从该端点删除,那么此时的双端队列就演变为两个栈底相邻的栈 + - 如果限定双端队列从某个断点插入的元素只能从该端点删除,那么此时的双端队列就演变为两个栈底相邻的栈 - - 补充 + - 补充 - - 最适合用来链队的链表是:带队首指针和队尾指针的非循环单链表 - - 栈和队列的逻辑结构都是线性表,存储结构可能是顺序的(顺序栈、顺序队列),也可能是链式的(链栈、链队) - - 不论是顺序存储还是链式存储,栈和队列都只能进行顺序存取(本质是线性表)。数组是可以做到随机存取(本质是顺序表) - - 队列先进先出的特性:先进队列的元素先出队列,后进队列的元素后出队列 + - 最适合用来链队的链表是:带队首指针和队尾指针的非循环单链表 + - 栈和队列的逻辑结构都是线性表,存储结构可能是顺序的(顺序栈、顺序队列),也可能是链式的(链栈、链队) + - 不论是顺序存储还是链式存储,栈和队列都只能进行顺序存取(本质是线性表)。数组是可以做到随机存取(本质是顺序表) + - 队列先进先出的特性:先进队列的元素先出队列,后进队列的元素后出队列 ### 应用 @@ -762,31 +760,31 @@ - 【栈】表达式求值 - 【栈】递归算法 - - 定义: 如果在一个函数、过程或数据结构的定义中又应用了自身,那么这个函数、过程或者数据结构称为递归定义的,简称递归。 - - 递归通常把一个大型的复杂问题,层层转化为一个与原问题相似的规模较小的问题来求解 - - 斐波拉切数列算法优化 + - 定义: 如果在一个函数、过程或数据结构的定义中又应用了自身,那么这个函数、过程或者数据结构称为递归定义的,简称递归。 + - 递归通常把一个大型的复杂问题,层层转化为一个与原问题相似的规模较小的问题来求解 + - 斐波拉切数列算法优化 - - 使用非递归实现 - - 使用空间换效率,例如:数组 - - 使用缓存,存放数据 + - 使用非递归实现 + - 使用空间换效率,例如:数组 + - 使用缓存,存放数据 - - 必须注意递归模型不能是循环定义, + - 必须注意递归模型不能是循环定义, 需要满足两个条件 - - 递归表达式(递归体) - - 边界条件(递归出口),即:算法结束条件 + - 递归表达式(递归体) + - 边界条件(递归出口),即:算法结束条件 - - 特点 + - 特点 - - 很大程度上减少了程序的代码量 - - 算法效率不高【重要特点】 - - 调用次数过多容易造成栈溢出 + - 很大程度上减少了程序的代码量 + - 算法效率不高【重要特点】 + - 调用次数过多容易造成栈溢出 - 【队列】层次遍历 - 【队列】计算机系统 - - 解决主机和外部设备之间速度不匹配的问题 - - 解决由多用户引起的资源竞争问题 + - 解决主机和外部设备之间速度不匹配的问题 + - 解决由多用户引起的资源竞争问题 ### 特殊矩阵的压缩存储 @@ -794,34 +792,34 @@ - 数组定义:由n(n≥1)个相同类型的数据元素构成的有限序列。 - 重要概念 - - 【压缩存储】多个值相同的元素只分配一个存储空间,对零元素不分配存储空间---->节省存储空间。 - - 【特殊矩阵】具有很多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。 - - 【稀疏矩阵】矩阵元素个数s相对于矩阵中非零元素的个数t来说非常多、差距非常大,即`s>>t的矩阵`可以叫`稀疏矩阵` + - 【压缩存储】多个值相同的元素只分配一个存储空间,对零元素不分配存储空间---->节省存储空间。 + - 【特殊矩阵】具有很多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。 + - 【稀疏矩阵】矩阵元素个数s相对于矩阵中非零元素的个数t来说非常多、差距非常大,即`s>>t的矩阵`可以叫`稀疏矩阵` - 常见的特殊矩阵 - - 对称矩阵 - - 上、下三角矩阵 - - 对角矩阵(带状矩阵) - - ...... + - 对称矩阵 + - 上、下三角矩阵 + - 对角矩阵(带状矩阵) + - ...... - 注意 - - 常规方法来存储稀疏矩阵,会想当浪费存储空间,所以稀疏矩阵只需要存储非零元素 - - 通常非零元素的分布是没有规律的,除了存储非零元素外,还需要存储元素所在位置的行和列 - - 寻相互存储三元组 `<行标,列表,值>` - - 三元组的结点存储了行标(row)、列表(col)、值(value)三种信息,是主要用来存储稀疏矩阵的一种数据结构 + - 常规方法来存储稀疏矩阵,会想当浪费存储空间,所以稀疏矩阵只需要存储非零元素 + - 通常非零元素的分布是没有规律的,除了存储非零元素外,还需要存储元素所在位置的行和列 + - 寻相互存储三元组 `<行标,列表,值>` + - 三元组的结点存储了行标(row)、列表(col)、值(value)三种信息,是主要用来存储稀疏矩阵的一种数据结构 - 数组和线性表的关系 - - 数组是线性表的推广 - - 数组一旦被定义,维数和维界就不再改变 - - 除了结构的初始化和销毁外,数组只会有存取元素和修改元素的操作 + - 数组是线性表的推广 + - 数组一旦被定义,维数和维界就不再改变 + - 除了结构的初始化和销毁外,数组只会有存取元素和修改元素的操作 - 数组的存储结构 - - 按行优先 - - 按列优先 + - 按行优先 + - 按列优先 ## 树与二叉树 @@ -830,25 +828,25 @@ - 定义 - 术语 - - 结点 + - 结点 - - 祖先结点 - - 父子结点 - - 兄弟结点 - - 孩子结点 - - 子孙结点 - - 分支结点 - - 叶子结点(终端结点) + - 祖先结点 + - 父子结点 + - 兄弟结点 + - 孩子结点 + - 子孙结点 + - 分支结点 + - 叶子结点(终端结点) - - 度 + - 度 - - 结点的度 - - 树的度 + - 结点的度 + - 树的度 - - 结点的深度、高度、层次 - - 有序树和无序树 - - 路径和路径长度 - - 森林 + - 结点的深度、高度、层次 + - 有序树和无序树 + - 路径和路径长度 + - 森林 - 性质 @@ -917,88 +915,88 @@ - 查找:在数据集合中寻找满足某种条件的数据元素的过程 - 查找表(查找结构):用于查找的数据集合 - - 数据元素(记录)的类型相同 - - 可以是一个数组或者链表等数据类型 - - 常见操作 + - 数据元素(记录)的类型相同 + - 可以是一个数组或者链表等数据类型 + - 常见操作 - - 查询某个特定元素是否存在 - - 检索满足条件的特定元素的各种属性 - - 数据元素插入 - - 数据元素删除 + - 查询某个特定元素是否存在 + - 检索满足条件的特定元素的各种属性 + - 数据元素插入 + - 数据元素删除 - 静态查找表:不需要动态地修改查找表,与动态查找表对应 - - 顺序查找 - - 折半查找 - - 散列查找 - - .... + - 顺序查找 + - 折半查找 + - 散列查找 + - .... - 动态查找表:需要动态地插入或者删除的查找表 - - 二叉排序树的查找 - - 散列查找 - - .... + - 二叉排序树的查找 + - 散列查找 + - .... - 关键字:数据元素中唯一标识该元素的某个数据项的值 - - 使用关键字查找,查找结果应该是【唯一的】 - - 可以类比集合中不重复的key - - 是不是想起了数据库的主键的概念???? + - 使用关键字查找,查找结果应该是【唯一的】 + - 可以类比集合中不重复的key + - 是不是想起了数据库的主键的概念???? - 平均查找长度:所有查找过程中进行关键字的比较次数的平均值 - - 查找长度:一次查找需要比较的关键字次数 - - 【是衡量查找算法效率的最主要的指标】 + - 查找长度:一次查找需要比较的关键字次数 + - 【是衡量查找算法效率的最主要的指标】 ### 顺序查找(线性查找) - 主要用于在线性表中进行查找 - - 一般的【无序线性表】的顺序查找 - - 按关键字【有序的顺序表】的顺序查找 - - Tips:顺序表是指顺序存储的线性表,前面的有序才强调元素有序,顺序强调的是存储方式 + - 一般的【无序线性表】的顺序查找 + - 按关键字【有序的顺序表】的顺序查找 + - Tips:顺序表是指顺序存储的线性表,前面的有序才强调元素有序,顺序强调的是存储方式 - 基于一般线性表的顺序查找 - - 最直观的查找方式 - - 基本思想:从线性表的一端开始,逐个查询条件和关键字进行比对即可 - - 【重要】:哨兵的引入,可以避免很多不必要的判断语句,提高程序的效率 - - 平均查找长度 + - 最直观的查找方式 + - 基本思想:从线性表的一端开始,逐个查询条件和关键字进行比对即可 + - 【重要】:哨兵的引入,可以避免很多不必要的判断语句,提高程序的效率 + - 平均查找长度 - - 查找成功 + - 查找成功 - - 第i个元素需要进行(n-i+1)次关键字比较 - - 概率相等的情况下:(n+1)/2 + - 第i个元素需要进行(n-i+1)次关键字比较 + - 概率相等的情况下:(n+1)/2 - - 查找失败【没有找到元素】 + - 查找失败【没有找到元素】 - - 各关键字比较次数:(n+1) - - 平均查找长度:(n+1) + - 各关键字比较次数:(n+1) + - 平均查找长度:(n+1) - - 综合分析 + - 综合分析 - - 【缺点】:n较大时,平均查找长度较大,效率低 - - 【优点】:对数据元素的存储没有要求,顺序存储和链式存储都可行。对数据元素的有序性也没有要求 - - 【注意】:线性的链表只能进行顺序查找 + - 【缺点】:n较大时,平均查找长度较大,效率低 + - 【优点】:对数据元素的存储没有要求,顺序存储和链式存储都可行。对数据元素的有序性也没有要求 + - 【注意】:线性的链表只能进行顺序查找 - - 通常情况下,查找表中记录的查找概率并不相等 + - 通常情况下,查找表中记录的查找概率并不相等 - 基于有序表的顺序查找 - - 预先已经知道表是按照关键字有序的,基于【二叉判定树】来查找,不用全部遍历----->【降低顺序查找失败的平均查找长度】 - - 平均查找长度 + - 预先已经知道表是按照关键字有序的,基于【二叉判定树】来查找,不用全部遍历----->【降低顺序查找失败的平均查找长度】 + - 平均查找长度 - - 查找成功 + - 查找成功 - - 和一般线性表的顺序查找一样 - - 概率相等的情况下:(n+1)/2 + - 和一般线性表的顺序查找一样 + - 概率相等的情况下:(n+1)/2 - - 查找失败 + - 查找失败 - - 到达是失败结点所查找的长度=失败结点父结点所在的层数【建议画画二叉判定树】 - - 查找概率相等时,平均查找长度:n/2 + n/(n+1) + - 到达是失败结点所查找的长度=失败结点父结点所在的层数【建议画画二叉判定树】 + - 查找概率相等时,平均查找长度:n/2 + n/(n+1) - - 【注意】:有序表的顺序查找中的线性表可以是链式存储结构的 + - 【注意】:有序表的顺序查找中的线性表可以是链式存储结构的 ### 折半查找(二分查找) @@ -1007,18 +1005,18 @@ - 核心思路:左右双指针,互相往中间靠拢,可以用二叉判定树来辅助思考 - 平均查找长度【计算非常重要】 - - 查找成功 + - 查找成功 - - 折半查找法查到给定值的比较次数最多不会超过【判定树】的高度 - - 相等概率下,平均查找长度约等于log2(n+1) -1 ,【建议结合二叉树高度计算来理解】 + - 折半查找法查到给定值的比较次数最多不会超过【判定树】的高度 + - 相等概率下,平均查找长度约等于log2(n+1) -1 ,【建议结合二叉树高度计算来理解】 - - 查找失败直接看例题..... + - 查找失败直接看例题..... - 综合分析 - - 折半查找的时间复杂度为O(log2n), 平均情况下笔顺序查找O(n)的效率高 - - 折半查找需要方便地定位查找区域---->存储结构必须具有【随机存取】的特性 - - 【注意】仅仅适用于有序的顺序表,不适用链式存储结构,要求表按关键字有序排列 + - 折半查找的时间复杂度为O(log2n), 平均情况下笔顺序查找O(n)的效率高 + - 折半查找需要方便地定位查找区域---->存储结构必须具有【随机存取】的特性 + - 【注意】仅仅适用于有序的顺序表,不适用链式存储结构,要求表按关键字有序排列 ### 分块查找(索引顺序查找) @@ -1026,15 +1024,15 @@ - 是不是有点【希尔排序】和【直接插入排序、折半插入排序】的发展效果????? - 基本思想:查找表分成若干个子块 - - 块内元素可以无序,【块之间必须有序】 - - 前一块的最大关键字永远小于后一块的最小关键字 - - 【重要】:建立索引表,包含每个分块额最大关键字和第一个元素的地址(起始角标) - - 索引表按关键字有序排列 + - 块内元素可以无序,【块之间必须有序】 + - 前一块的最大关键字永远小于后一块的最小关键字 + - 【重要】:建立索引表,包含每个分块额最大关键字和第一个元素的地址(起始角标) + - 索引表按关键字有序排列 - 查找方式 - - 索引表:顺序查找或者折半查找 - - 块内:顺序查找<----- 块内可以无序 + - 索引表:顺序查找或者折半查找 + - 块内:顺序查找<----- 块内可以无序 - 【直接看书】平均查找长度=索引查找平均长度+块内查找的平均长度 @@ -1042,198 +1040,198 @@ - B树(多路平衡查找树) - - 基础概念 + - 基础概念 - - 阶:所有结点的孩子结点数的最大值 - - m阶B树(可能为空树)满足 + - 阶:所有结点的孩子结点数的最大值 + - m阶B树(可能为空树)满足 - - 树中每个结点至多有m棵子树(即至多包含m-1个关键字) - - 如果根结点不是终端结点,至少有两棵子树 - - 所有的叶结点都出现在同一个层次上,不带任何信息 - - .... + - 树中每个结点至多有m棵子树(即至多包含m-1个关键字) + - 如果根结点不是终端结点,至少有两棵子树 + - 所有的叶结点都出现在同一个层次上,不带任何信息 + - .... - - B树是所有结点的平衡因子均为0的多路查找树 + - B树是所有结点的平衡因子均为0的多路查找树 - - 基本操作 + - 基本操作 - - 高度 + - 高度 - - B树的大部分操作需要的磁盘存取次数和B树的高度成正比 - - B树的高度不包括最后的不带任何信息的叶结点所处的那一层【有的参考书,也包含这部分】 - - 【重要】如果每个结点重点额关键字个数达到最少,则容纳同样多关键字的B树的高度可以达到最大 - - .... + - B树的大部分操作需要的磁盘存取次数和B树的高度成正比 + - B树的高度不包括最后的不带任何信息的叶结点所处的那一层【有的参考书,也包含这部分】 + - 【重要】如果每个结点重点额关键字个数达到最少,则容纳同样多关键字的B树的高度可以达到最大 + - .... - - 查找 + - 查找 - - 步骤 + - 步骤 - - 在B树中找结点【磁盘中进行】 - - 在结点内找关键字【内存中进行】----> 采用【顺序查找法】或【折半查找法】 - - 【Tips】B树常存储在磁盘上,在磁盘上找到目标节点后,将结点中的信息读入到内存 + - 在B树中找结点【磁盘中进行】 + - 在结点内找关键字【内存中进行】----> 采用【顺序查找法】或【折半查找法】 + - 【Tips】B树常存储在磁盘上,在磁盘上找到目标节点后,将结点中的信息读入到内存 - - 当查找到叶子结点,对应的指针为空指针,即树中没有对应的关键字 + - 当查找到叶子结点,对应的指针为空指针,即树中没有对应的关键字 + + - 插入 + + - 插入操作比查找操作复杂多 + - 步骤 + + - 定位 + + - B树查找算法--->最底层中某个非叶结点 + - 【重要】B树的插入关键字一定是插入到最底层的某个非叶结点内 - 插入 - - 插入操作比查找操作复杂多 - - 步骤 + - 插入结点关键字个数小于m----> 直接插入 + - 插入后检查插入结点内关键字个数,【大于m-1必须进行分裂】 - - 定位 + - 【直接看书】】注意分裂的方法 - - B树查找算法--->最底层中某个非叶结点 - - 【重要】B树的插入关键字一定是插入到最底层的某个非叶结点内 + - 删除(删除的关键字在终端结点) - - 插入 - - - 插入结点关键字个数小于m----> 直接插入 - - 插入后检查插入结点内关键字个数,【大于m-1必须进行分裂】 - - - 【直接看书】】注意分裂的方法 - - - 删除(删除的关键字在终端结点) - - - 直接删除关键字 - - 兄弟够借 - - 兄弟不够借 + - 直接删除关键字 + - 兄弟够借 + - 兄弟不够借 - B+树的概念 - - B+树是根据数据库的需要需要的一中B树的变形树 - - m阶的B+树需要满足的条件 + - B+树是根据数据库的需要需要的一中B树的变形树 + - m阶的B+树需要满足的条件 - - 每个分支结点最多有m棵子树(子结点) - - 结点的字树个数与关键字相等 - - 非叶、根结点至少有两棵子树,其他分支结点至少有m/2(向上取整)棵子树 - - 所有叶结点包含全部关键字及指向相应记录的指针 + - 每个分支结点最多有m棵子树(子结点) + - 结点的字树个数与关键字相等 + - 非叶、根结点至少有两棵子树,其他分支结点至少有m/2(向上取整)棵子树 + - 所有叶结点包含全部关键字及指向相应记录的指针 - - 叶结点按关键字大小排列 - - 相邻结点按大小顺序相互链接起来 + - 叶结点按关键字大小排列 + - 相邻结点按大小顺序相互链接起来 - - 【反复理解】所有的分支结点(理解为索引的索引)中仅仅包含它的各个子结点(下一级的索引快)中关键字的最大值和指向其子结点的指针 - - .... + - 【反复理解】所有的分支结点(理解为索引的索引)中仅仅包含它的各个子结点(下一级的索引快)中关键字的最大值和指向其子结点的指针 + - .... ### 散列(Hash)表 - 基本概念 - - 散列函数:一个把查找表中的关键字映射成该关键字对应的地址(数组下标、索引、内存地址等)的函数 - - 散列冲突:散列函数把两个或者多个不同关键字映射到同一个地址上,【冲突总是不可避免的】 - - 同义词:发生散列冲突(碰撞)的不同关键字 - - 散列表:根据关键字直接访问的数据结构,是关键字和存储地址之间的一种直接映射关系 - - 理想情况下,散列表中查找时间复杂度为O(1),与元素个数无关 - - 基于【比较】的查找算法,查找效率取决于比较的次数 - - 以上可以结合哈希加密、布隆过滤器等工作中的编程概念去比对学习.... + - 散列函数:一个把查找表中的关键字映射成该关键字对应的地址(数组下标、索引、内存地址等)的函数 + - 散列冲突:散列函数把两个或者多个不同关键字映射到同一个地址上,【冲突总是不可避免的】 + - 同义词:发生散列冲突(碰撞)的不同关键字 + - 散列表:根据关键字直接访问的数据结构,是关键字和存储地址之间的一种直接映射关系 + - 理想情况下,散列表中查找时间复杂度为O(1),与元素个数无关 + - 基于【比较】的查找算法,查找效率取决于比较的次数 + - 以上可以结合哈希加密、布隆过滤器等工作中的编程概念去比对学习.... - 散列函数 - - 构造散列函数,需要注意 + - 构造散列函数,需要注意 - - 散列函数的定义域【必须】要包含全部需要存储的关键字,值域的范围则依赖于散列表的大小或地址范围 - - 散列函数计算出来的地址应该能【等概率、均匀的】分布在整个存储空间,尽可能减少散列冲突---> 【压测】 - - 散列函数应该尽量简单,能够在较短时间内就计算出任一关键字对应的散列地址 + - 散列函数的定义域【必须】要包含全部需要存储的关键字,值域的范围则依赖于散列表的大小或地址范围 + - 散列函数计算出来的地址应该能【等概率、均匀的】分布在整个存储空间,尽可能减少散列冲突---> 【压测】 + - 散列函数应该尽量简单,能够在较短时间内就计算出任一关键字对应的散列地址 - - 常用散列函数 + - 常用散列函数 - - 直接定址法 + - 直接定址法 - - 直接去关键字的某个【线性函数值】为散列函数 - - 优点 + - 直接去关键字的某个【线性函数值】为散列函数 + - 优点 - - 计算简单 - - 【不会产生冲突】 - - 适合关键字的分布【基本连续】的情况 + - 计算简单 + - 【不会产生冲突】 + - 适合关键字的分布【基本连续】的情况 - - 缺点:关键字分布不连续时,空位较多,将造成存储空间的浪费 + - 缺点:关键字分布不连续时,空位较多,将造成存储空间的浪费 - - 除留余数法 + - 除留余数法 - - 最简单、最常用的散列方法 - - 关键在于【选择被除数P】,等概率进行映射,尽可能减少冲突的可能性 + - 最简单、最常用的散列方法 + - 关键在于【选择被除数P】,等概率进行映射,尽可能减少冲突的可能性 - - 数字分析法 + - 数字分析法 - - 适用于已知的关键字集合 - - 如果更换了关键字,就需要重新构造新的散列函数 + - 适用于已知的关键字集合 + - 如果更换了关键字,就需要重新构造新的散列函数 - - 平方取中法 + - 平方取中法 - - 取关键字的平方值的中间几位来作为散列地址 - - 适用于关键字的每一位取值都不够均匀或小于散列地址所需要的位数 + - 取关键字的平方值的中间几位来作为散列地址 + - 适用于关键字的每一位取值都不够均匀或小于散列地址所需要的位数 - - 折叠法 + - 折叠法 - - 将关键字分割成位数相同的几部分,取这几部分的叠加作为散列地址 - - 关键字位数很多,每一位上数字分布大致均匀时,可以采用折叠法得到散列地址 + - 将关键字分割成位数相同的几部分,取这几部分的叠加作为散列地址 + - 关键字位数很多,每一位上数字分布大致均匀时,可以采用折叠法得到散列地址 - - ..... + - ..... - - 不同的情况,不同的散列函数会发挥不同的性能,无法笼统的说那种散列函数最好。散列函数的目标都是为了将产生冲突的可能性尽可能地降低 + - 不同的情况,不同的散列函数会发挥不同的性能,无法笼统的说那种散列函数最好。散列函数的目标都是为了将产生冲突的可能性尽可能地降低 - 处理冲突 - - 【任何设计出来的散列函数都不可能绝对地避免冲突】,必须考虑在发生冲突时如何进行处理 - - 处理方法 + - 【任何设计出来的散列函数都不可能绝对地避免冲突】,必须考虑在发生冲突时如何进行处理 + - 处理方法 - - 开放定址法 + - 开放定址法 - - 概念:可以存放新表项的空闲地址,既向它的同义词表项开放,也向它的非同义词表项开放 - - 增量取值方法 + - 概念:可以存放新表项的空闲地址,既向它的同义词表项开放,也向它的非同义词表项开放 + - 增量取值方法 - - 线性探测法 - - 平方探测法 - - 再散列法(双散列法) - - 伪随机序列法 + - 线性探测法 + - 平方探测法 + - 再散列法(双散列法) + - 伪随机序列法 - - 注意事项 + - 注意事项 - - 不能随便【物理删除】表中已有元素,删除将会截断具有相同散列地址元素的查找地址,牵涉元素广 - - 删除元素需要【单独做标记】,采用【逻辑删除】 - - 逻辑删除会导致散列表表面上看上满的,实际上很多位置都是没有被利用的,【需要定期维护,将删除标记的元素物理删除】 + - 不能随便【物理删除】表中已有元素,删除将会截断具有相同散列地址元素的查找地址,牵涉元素广 + - 删除元素需要【单独做标记】,采用【逻辑删除】 + - 逻辑删除会导致散列表表面上看上满的,实际上很多位置都是没有被利用的,【需要定期维护,将删除标记的元素物理删除】 - - 拉链(链接)法 + - 拉链(链接)法 - - 概念:为避免非同义词发生冲突,可以把所有的同义词存储在一个线性链表中【由散列地址唯一标识】 - - 【重要】适用于经常进行插入和删除的情况 + - 概念:为避免非同义词发生冲突,可以把所有的同义词存储在一个线性链表中【由散列地址唯一标识】 + - 【重要】适用于经常进行插入和删除的情况 - - 拉链法处理冲突时不存在聚集现象,用线性探测法处理冲突时容易产生聚集现象 + - 拉链法处理冲突时不存在聚集现象,用线性探测法处理冲突时容易产生聚集现象 - 性能分析 - - 装填因子:一个表的装满程度 =(表中的记录数)/ (散列表的长度) - - 查找效率取决于 + - 装填因子:一个表的装满程度 =(表中的记录数)/ (散列表的长度) + - 查找效率取决于 - - 散列函数 - - 处理冲突的方法 - - 【重要】装填因子 + - 散列函数 + - 处理冲突的方法 + - 【重要】装填因子 - - 散列表的平均查找长度依赖于【散列表的填装因子】 - - 填装因子越大,表示装填的越“满”,发生冲突的可能性就越大 - - 散列冲突导致散列表在查找过程中也是需要进行比较的。【查找效率仍然用平均查找长度来度量】 - - 冲突的产生概率与装填因子(表中记录数和表长)的大小成正比 + - 散列表的平均查找长度依赖于【散列表的填装因子】 + - 填装因子越大,表示装填的越“满”,发生冲突的可能性就越大 + - 散列冲突导致散列表在查找过程中也是需要进行比较的。【查找效率仍然用平均查找长度来度量】 + - 冲突的产生概率与装填因子(表中记录数和表长)的大小成正比 ### 模式匹配(字符串) - 简单模式匹配 - - 概念:第一个字符串(模式串)在第二串(主串)中的位置 - - 基本过程:从主串指定字符开始(一般第一个)和模式串的第一个字符逐个比较.... - - 时间复杂度:O(n*m),n、m分别为主串和模式串的长度 + - 概念:第一个字符串(模式串)在第二串(主串)中的位置 + - 基本过程:从主串指定字符开始(一般第一个)和模式串的第一个字符逐个比较.... + - 时间复杂度:O(n*m),n、m分别为主串和模式串的长度 - 【难点,直接看代码理解】KMP算法 - - 【重要】是对简单模式匹配的改造,时间复杂度在O(n+m)的数量集上 - - 【建议手动模拟】基本过程 + - 【重要】是对简单模式匹配的改造,时间复杂度在O(n+m)的数量集上 + - 【建议手动模拟】基本过程 - - 整个匹配过程,没有进行指针回溯 - - 每趟比较过程让子串向后滑动到一个合适位置, 让这个位置上的字符和主串中的那个字符比较 - - 【重要】next数组的求解实际是对某个位置找到最长的公共前缀 + - 整个匹配过程,没有进行指针回溯 + - 每趟比较过程让子串向后滑动到一个合适位置, 让这个位置上的字符和主串中的那个字符比较 + - 【重要】next数组的求解实际是对某个位置找到最长的公共前缀 - 总结比较 - - 简单模式匹配时间复杂度:O(n*m) - - KMP算法的时间复杂度为O(n+m) - - 一般情况下,简单模式匹配的实际执行时间可以近似到O(n+m) - - 【重要】KMP算法的重要特点是主串指针不回溯 + - 简单模式匹配时间复杂度:O(n*m) + - KMP算法的时间复杂度为O(n+m) + - 一般情况下,简单模式匹配的实际执行时间可以近似到O(n+m) + - 【重要】KMP算法的重要特点是主串指针不回溯 ## 排序 @@ -1244,9 +1242,9 @@ - 排序算法是否具有稳定性并不能衡量一个算法的优劣【重要】 - 内部排序:在排序期间元素全部存放在内存中的排序 - - 关键字比较 - - 移动元素 - - 不是所有的内部排序算法都是基于比较操作的,例如:基数排序属于内部排序算法,但不是基于比较实现的 + - 关键字比较 + - 移动元素 + - 不是所有的内部排序算法都是基于比较操作的,例如:基数排序属于内部排序算法,但不是基于比较实现的 - 外部排序:在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断地在内、外存之间移动的排序。 @@ -1255,138 +1253,138 @@ - 基本思想:每次将一个待排序的记录,按关键字大小插入到前面已经排序好的子序列中,直到全部记录插入完成 - 直接插入排序 - - 最简单、最直观的插入排序算法 - - 性能分析 + - 最简单、最直观的插入排序算法 + - 性能分析 - - 空间效率:仅仅使用到了常数个辅助单元,空间复杂度为O(1) - - 时间效率:排序过程中,需要向左侧有序子表中逐个插入元素,操作n-1次,每次操作都分为关键字比较和元素移动这两部分的次数非常依赖于待排序表的初始状态【重要】 + - 空间效率:仅仅使用到了常数个辅助单元,空间复杂度为O(1) + - 时间效率:排序过程中,需要向左侧有序子表中逐个插入元素,操作n-1次,每次操作都分为关键字比较和元素移动这两部分的次数非常依赖于待排序表的初始状态【重要】 - - 最好的情况:元素已经有序,每个元素之需要比较一次,不用移动元素,O(n) - - 最坏的情况:元素逆序,比较多次,移动多次,O(n^2) - - 平均情况:总的比较次数和总的移动次数均约等于为(n^2)/4 + - 最好的情况:元素已经有序,每个元素之需要比较一次,不用移动元素,O(n) + - 最坏的情况:元素逆序,比较多次,移动多次,O(n^2) + - 平均情况:总的比较次数和总的移动次数均约等于为(n^2)/4 ​ - - 稳定性: 【稳定】的排序算法 - - 适用性 + - 稳定性: 【稳定】的排序算法 + - 适用性 - - 顺序存储的线性表 - - 链式存储的线性表 - - 大部分排序算法都仅仅适用于顺序存储的线性表【重要】 + - 顺序存储的线性表 + - 链式存储的线性表 + - 大部分排序算法都仅仅适用于顺序存储的线性表【重要】 - 折半插入排序 - - 简述 + - 简述 - - 直接插入:边比较边移动 + - 直接插入:边比较边移动 - - 确定插入位置 - - 腾出空间,元素复制到插入位置 + - 确定插入位置 + - 腾出空间,元素复制到插入位置 - - 折半插入:先比较再统一移动 + - 折半插入:先比较再统一移动 - - 确定好待插入的位置后,再统一地向后移动元素 + - 确定好待插入的位置后,再统一地向后移动元素 - - 性能分析 + - 性能分析 - - 折半插入排序的比较次数与待排序表的初始状态无关,仅仅取决于表中的元素个数n - - 移动元素的次数相比直接插入排序没有任何的改变 - - 直接插入排序和折半插入排序的比较次数一样,依赖于排序表的初始状态 - - 时间复杂度:O(n^2) - - 稳定性:【稳定】的排序算法 + - 折半插入排序的比较次数与待排序表的初始状态无关,仅仅取决于表中的元素个数n + - 移动元素的次数相比直接插入排序没有任何的改变 + - 直接插入排序和折半插入排序的比较次数一样,依赖于排序表的初始状态 + - 时间复杂度:O(n^2) + - 稳定性:【稳定】的排序算法 - 希尔排序(缩小增量排序) - - 基本思想:将待排序表分割成为若干个L[i,i+d,i+2d,....,i+kd]的子表,分别进行直接插入排序,当整个表元素“基本有序”的时候,再对全体记录进行一次直接插入排序 - - 基本实现步骤 + - 基本思想:将待排序表分割成为若干个L[i,i+d,i+2d,....,i+kd]的子表,分别进行直接插入排序,当整个表元素“基本有序”的时候,再对全体记录进行一次直接插入排序 + - 基本实现步骤 - - 第一步:取一个小于n的步长d1 ,把待排序的表分成d1个组,所有距离为d1的倍数的记录放在同一个组中,对各组进行直接插入排序 - - 第二步:取第二个步长d2 < d1,重复第一步 + - 第一步:取一个小于n的步长d1 ,把待排序的表分成d1个组,所有距离为d1的倍数的记录放在同一个组中,对各组进行直接插入排序 + - 第二步:取第二个步长d2 < d1,重复第一步 - - 主要操作 + - 主要操作 - - 确认步长,分组 - - 对分组元素进行直接插入排序 + - 确认步长,分组 + - 对分组元素进行直接插入排序 - - 性能分析 + - 性能分析 - - 空间效率:仅仅使用到了常数个辅助单元,O(1) - - 时间效率 + - 空间效率:仅仅使用到了常数个辅助单元,O(1) + - 时间效率 - - 直接插入排序 + - 直接插入排序 - - 是顺序的,时间复杂度最最小,O(n) - - 是逆序的,时间复杂度最大,O(n^2) - - 是局部有序的,即部分顺序、部分逆序,此时的时间复杂度介于两者之间,O(n)~O(n^2) + - 是顺序的,时间复杂度最最小,O(n) + - 是逆序的,时间复杂度最大,O(n^2) + - 是局部有序的,即部分顺序、部分逆序,此时的时间复杂度介于两者之间,O(n)~O(n^2) - - 取决于增量序列函数 + - 取决于增量序列函数 - - 优于折半插入排序 - - 最坏情况为O(n^2) + - 优于折半插入排序 + - 最坏情况为O(n^2) - - 稳定性:【不稳定】,存在相同值元素分在不同的组进行直接插入排序 - - 适用性:仅仅适用于顺序存储的线性表,虽然采用过程中有采用直接插入排序,但增量序列不为1的时候,需要随机存取,链式存储的时候无法满足 + - 稳定性:【不稳定】,存在相同值元素分在不同的组进行直接插入排序 + - 适用性:仅仅适用于顺序存储的线性表,虽然采用过程中有采用直接插入排序,但增量序列不为1的时候,需要随机存取,链式存储的时候无法满足 ### 交换排序 - 冒泡排序 - - 算法简单、思路直接、十分常用但考查少 - - 两元素交换方案 + - 算法简单、思路直接、十分常用但考查少 + - 两元素交换方案 - - 临时变量法 - - 加减法 + - 临时变量法 + - 加减法 - - 空间效率 + - 空间效率 - - 仅使用了常数个辅助单元 - - 空间复杂度为O(1) + - 仅使用了常数个辅助单元 + - 空间复杂度为O(1) - - 时间效率 + - 时间效率 - - 最好情况(顺序) + - 最好情况(顺序) - - 比较次数:n-1 - - 移动次数:0 - - 时间复杂度为:O(n) + - 比较次数:n-1 + - 移动次数:0 + - 时间复杂度为:O(n) - - 最坏情况(逆序) + - 最坏情况(逆序) - - 比较次数:每趟比较(n-i)次 - - 移动次数:每趟移动3次 - - 时间复杂度为:O(n^2) + - 比较次数:每趟比较(n-i)次 + - 移动次数:每趟移动3次 + - 时间复杂度为:O(n^2) - - 时间复杂度为:O(n^2) + - 时间复杂度为:O(n^2) - - 稳定性:【稳定】 + - 稳定性:【稳定】 - 快速排序 - - 基于递归、理解困难、分而治之、关键基准pivot划分 - - 空间效率 + - 基于递归、理解困难、分而治之、关键基准pivot划分 + - 空间效率 - - 基于递归实现,需要借助递归工作栈来保存每一次递归调用的必要信息 - - 最坏情况:进行n-1次递归,O(n) - - 最好情况: log2(n+1) 向上取整 - - 平均情况: O((n+1)以2为底的对数) + - 基于递归实现,需要借助递归工作栈来保存每一次递归调用的必要信息 + - 最坏情况:进行n-1次递归,O(n) + - 最好情况: log2(n+1) 向上取整 + - 平均情况: O((n+1)以2为底的对数) - - 时间效率 + - 时间效率 - - 运行时间与划分操作Partition()函数【不对称相关】 - - 最坏情况 + - 运行时间与划分操作Partition()函数【不对称相关】 + - 最坏情况 - - 数组长度为n - - 左侧快排的数组长度为n-1,有n-1个元素【初始排序表基本有序】 - - 右侧快排的数组长度为0,有0个元素【初始排序表基本逆序】 - - 时间复杂度为:O(n^2) + - 数组长度为n + - 左侧快排的数组长度为n-1,有n-1个元素【初始排序表基本有序】 + - 右侧快排的数组长度为0,有0个元素【初始排序表基本逆序】 + - 时间复杂度为:O(n^2) - - 效率优化 + - 效率优化 - - 递归过程中划分得到的子序列规模较小时候,不再递归调用快速排序 ----->改用直接插入排序【时间复杂度最好O(n),性能好】 - - 尽量选择能将数据中分的基准值元素 - - 随机从当前表中选取基准值元素,几乎避免最坏情况的发生 + - 递归过程中划分得到的子序列规模较小时候,不再递归调用快速排序 ----->改用直接插入排序【时间复杂度最好O(n),性能好】 + - 尽量选择能将数据中分的基准值元素 + - 随机从当前表中选取基准值元素,几乎避免最坏情况的发生 - - 稳定性:【不稳定】,存在值相同的元素,位置与最终位置不一致情况 - - 重要:【是所有内部算法中平均新能最优的排序算法】 + - 稳定性:【不稳定】,存在值相同的元素,位置与最终位置不一致情况 + - 重要:【是所有内部算法中平均新能最优的排序算法】 ### 选择排序(TBD) @@ -1400,204 +1398,202 @@ - 很特别的排序算法,【不是基于比较进行排序的】 - 基本步骤【趟数取决于元素的最大位数】 - - 分配:依次考察线性表元素,放入队列中 - - 收集:各队列中结点一次首尾相接,组成新的线性表 + - 分配:依次考察线性表元素,放入队列中 + - 收集:各队列中结点一次首尾相接,组成新的线性表 - 分类 - - 最高位优先排序【MSD】 - - 最低位优先排序【LSD】 + - 最高位优先排序【MSD】 + - 最低位优先排序【LSD】 - 性能分析 - - 空间效率: + - 空间效率: - - 一趟排序需要r个队列的辅助存储空间,后续排序这些队列将会复用 - - 空间复杂度为:O(n) + - 一趟排序需要r个队列的辅助存储空间,后续排序这些队列将会复用 + - 空间复杂度为:O(n) - - 时间效率 + - 时间效率 - - 进行d趟分配和收集操作 + - 进行d趟分配和收集操作 - - 一趟分配需要O(n) - - 一趟收集需要O(r) + - 一趟分配需要O(n) + - 一趟收集需要O(r) - - 平均情况:时间复杂度为O(d*(n+r)) - - 【重要】算法的时间效率与初始排序表状态无关,依赖于分配和收集操作 + - 平均情况:时间复杂度为O(d*(n+r)) + - 【重要】算法的时间效率与初始排序表状态无关,依赖于分配和收集操作 - - 稳定性:【稳定】<----- 按位排序必须稳定 + - 稳定性:【稳定】<----- 按位排序必须稳定 ### 内部排序 - 各算法性能比较 - - 从时间复杂度来看 + - 从时间复杂度来看 - - 平均情况O(n^2) + - 平均情况O(n^2) - - 直接插入排序 - - 简单选择排序 - - 冒泡排序 + - 直接插入排序 + - 简单选择排序 + - 冒泡排序 - - 最好情况O(n)【顺序情况】 + - 最好情况O(n)【顺序情况】 - - 直接插入排序 - - 冒泡排序 + - 直接插入排序 + - 冒泡排序 - - O(nlog2n) + - O(nlog2n) - - 归并排序与初始序列的排序列无关,所有情况下时间复杂度都是O(nlog2n) - - 堆排序利用数据结构堆,线性时间完成建堆,在O(nlog2n)内完成排序 - - 快排平均性能可以达到O(nlog2n)【性能常常优于其他排序算法】 + - 归并排序与初始序列的排序列无关,所有情况下时间复杂度都是O(nlog2n) + - 堆排序利用数据结构堆,线性时间完成建堆,在O(nlog2n)内完成排序 + - 快排平均性能可以达到O(nlog2n)【性能常常优于其他排序算法】 - - 基于分治法的思想 + - 基于分治法的思想 - - 快速排序 - - 归并排序 + - 快速排序 + - 归并排序 - - 简单选择排序与序列的初始值状态无关 - - 希尔排序是插入排序的拓展,在大规模排序中可以达到很高的效率n^1.3~2 + - 简单选择排序与序列的初始值状态无关 + - 希尔排序是插入排序的拓展,在大规模排序中可以达到很高的效率n^1.3~2 - - 从空间复杂度来看 + - 从空间复杂度来看 - - 借助常数个辅助空间 + - 借助常数个辅助空间 - - 简单选择排序 - - 插入排序 - - 冒泡排序 - - 希尔排序 - - 堆排序 + - 简单选择排序 + - 插入排序 + - 冒泡排序 + - 希尔排序 + - 堆排序 - - 快速排序在空间上只适用一个小的辅助栈,实现【递归】 + - 快速排序在空间上只适用一个小的辅助栈,实现【递归】 - - 平均情况:O(log2n) - - 最坏情况:O(n) + - 平均情况:O(log2n) + - 最坏情况:O(n) - - 二路归并排序需要较多的辅助空间,为O(n),可以采取时间换空间的思路来减少辅助空间【不建议,导致算法复杂】 + - 二路归并排序需要较多的辅助空间,为O(n),可以采取时间换空间的思路来减少辅助空间【不建议,导致算法复杂】 - - 从稳定性来看 + - 从稳定性来看 - - 稳定的 + - 稳定的 - - 插入排序 - - 冒泡排序 - - 归并排序 - - 基数排序 + - 插入排序 + - 冒泡排序 + - 归并排序 + - 基数排序 - - 不稳定 + - 不稳定 - - 简单选择排序 - - 快速排序 - - 希尔排序 - - 堆排序 + - 简单选择排序 + - 快速排序 + - 希尔排序 + - 堆排序 - - 从过程特征来看 + - 从过程特征来看 - - 冒泡排序和堆排序每次循环都能拿到当前的最大值或最小值 - - 快速排序每次循环都能确定一个元素到最终位置上 - - 冒泡排序每一趟冒泡也能确定一个元素到最终位置上 + - 冒泡排序和堆排序每次循环都能拿到当前的最大值或最小值 + - 快速排序每次循环都能确定一个元素到最终位置上 + - 冒泡排序每一趟冒泡也能确定一个元素到最终位置上 - 算法运用 - - 排序方法选取需要考虑的因素 + - 排序方法选取需要考虑的因素 - - 待排序的元素数目n - - 元素本身信息量大小 - - 关键字的结构和分布情况 - - 稳定性的要求 - - 语言工具、存储结构、辅助空间大小 + - 待排序的元素数目n + - 元素本身信息量大小 + - 关键字的结构和分布情况 + - 稳定性的要求 + - 语言工具、存储结构、辅助空间大小 - - 排序算法小结 + - 排序算法小结 - - n很小时选择 + - n很小时选择 - - 直接插入排序 - - 简单插入排序 + - 直接插入排序 + - 简单插入排序 - - 关键字基本【有序】时选择 + - 关键字基本【有序】时选择 - - 直接插入排序 - - 冒泡排序 + - 直接插入排序 + - 冒泡排序 - - n较大时选择O(nlog2n)的排序 + - n较大时选择O(nlog2n)的排序 - - 快速排序【不稳定】 - - 堆排序【不稳定】 - - 归并排序【稳定】 + - 快速排序【不稳定】 + - 堆排序【不稳定】 + - 归并排序【稳定】 - - n很大且关键字位较少、可分解,建议选择【基数排序】 - - 信息量较大、元素较多,存储结构可以采用【链表】,减少不必要的时间去元素移动 + - n很大且关键字位较少、可分解,建议选择【基数排序】 + - 信息量较大、元素较多,存储结构可以采用【链表】,减少不必要的时间去元素移动 - - 快速排序被认为是基于比较的内部排序中最好的排序方法 - - 基于比较的排序算法中,每次比较两个关键字之后,只有两种情况(大于|小于)----> 二叉树, 时间复杂度至少为O(nlog2n) + - 快速排序被认为是基于比较的内部排序中最好的排序方法 + - 基于比较的排序算法中,每次比较两个关键字之后,只有两种情况(大于|小于)----> 二叉树, 时间复杂度至少为O(nlog2n) ### 外部排序 - 基本概念 - - 内部排序:排序方法在内存中进行的排序 - - 外部排序:排序过程中需要多次进行内存、外存交换,对外存文件中的记录进行排序后【仍然存放在外存原有文件中】的排序 - - 外部排序原因:对大文件进行排序,内存控件有限,文件中信息量庞大,无法将整个文件拷贝进内存中进行排序,需要多次调入内存进行排序 + - 内部排序:排序方法在内存中进行的排序 + - 外部排序:排序过程中需要多次进行内存、外存交换,对外存文件中的记录进行排序后【仍然存放在外存原有文件中】的排序 + - 外部排序原因:对大文件进行排序,内存控件有限,文件中信息量庞大,无法将整个文件拷贝进内存中进行排序,需要多次调入内存进行排序 - 外部排序方法 - - 分类【依据外存设备的不同】 + - 分类【依据外存设备的不同】 - - 磁盘文件排序 - - 磁带文件排序 + - 磁盘文件排序 + - 磁带文件排序 - - 分布方式 + - 分布方式 - - 磁盘是直接存取设备 - - 磁带是顺序存取设备 + - 磁盘是直接存取设备 + - 磁带是顺序存取设备 - - 文件通常是【按块存储】在磁盘上,操作系统也是【按块读取】磁盘上的信息 - - 外部排序中时间代价主要考虑【访问磁盘的次数】,即I/O次数 - - 【通常采用归并排序方法】 + - 文件通常是【按块存储】在磁盘上,操作系统也是【按块读取】磁盘上的信息 + - 外部排序中时间代价主要考虑【访问磁盘的次数】,即I/O次数 + - 【通常采用归并排序方法】 ### 补充总结和复习 - 元素个数不是很大(n<1000) - - 直接插入排序【稳定】 - - 冒泡排序【稳定】 - - 简单选择排序【不稳定】 - - 空间复杂度都为O(1),只需要一个辅助元素 - - 平均时间复杂度都为O(n^2) + - 直接插入排序【稳定】 + - 冒泡排序【稳定】 + - 简单选择排序【不稳定】 + - 空间复杂度都为O(1),只需要一个辅助元素 + - 平均时间复杂度都为O(n^2) - 中等规模的元素,希尔排序【不稳定】是非常好的选择,比直接插入排序要好(n越大越明显),不占用额外内存空间,减少直接排序次数 - 元素个数很多(n很大) - - 快速排序【不稳定】 + - 快速排序【不稳定】 - - 最通用、高效的内部排序算法 - - 平均时间复杂度为O(nlog2n) - - 一般空间复杂度为O(log2n) - - 最快情况,性能退化【元素基本有序时】 + - 最通用、高效的内部排序算法 + - 平均时间复杂度为O(nlog2n) + - 一般空间复杂度为O(log2n) + - 最快情况,性能退化【元素基本有序时】 - - 时间复杂度提高到O(n^2) - - 空间复杂度提高到O(n) - - 解决方案: 三者(low,mid,high)取中,获取枢纽值【注意严版采用的是low,high】 + - 时间复杂度提高到O(n^2) + - 空间复杂度提高到O(n) + - 解决方案: 三者(low,mid,high)取中,获取枢纽值【注意严版采用的是low,high】 - - 堆排序【不稳定】 + - 堆排序【不稳定】 - - 高效的内部排序算法 - - 时间复杂度为O(nlog2n) - - 没啥最坏情况,基本不需要额外的存储空间 + - 高效的内部排序算法 + - 时间复杂度为O(nlog2n) + - 没啥最坏情况,基本不需要额外的存储空间 - - 归并排序【稳定】 + - 归并排序【稳定】 - - 性能与初始化元素序列无关 - - 时间复杂度总为O(nlog2n) - - 【明显缺点】:需要O(n)的额外存储空间 + - 性能与初始化元素序列无关 + - 时间复杂度总为O(nlog2n) + - 【明显缺点】:需要O(n)的额外存储空间 - - 基数排序【稳定】 + - 基数排序【稳定】 - - 特殊的排序算法 - - 除了对元素序列的关键字比较,更对关键字的不同位也进行处理和比较 - - 具有线性增长的时间复杂度O(d*(n+r)),适用性比较低、应用场景相对少 - - 需要额外的存储空间,一般用队列来实现桶 + - 特殊的排序算法 + - 除了对元素序列的关键字比较,更对关键字的不同位也进行处理和比较 + - 具有线性增长的时间复杂度O(d*(n+r)),适用性比较低、应用场景相对少 + - 需要额外的存储空间,一般用队列来实现桶 - 【重要】不同的排序算法缓和使用,往往能够对算法进行不错的改进,获得更好的性能 - - diff --git a/docs/manuscripts/mark-map/os-map.md b/docs/manuscripts/mark-map/os-map.md index a9de4b7..6959bac 100644 --- a/docs/manuscripts/mark-map/os-map.md +++ b/docs/manuscripts/mark-map/os-map.md @@ -1,6 +1,5 @@ # 操作系统 - 在线预览 ## 引论 @@ -14,4 +13,3 @@ ## I/O管理 ## 文件管理 - diff --git a/docs/manuscripts/mark-map/readme.md b/docs/manuscripts/mark-map/readme.md index 1da0ebb..195ceae 100644 --- a/docs/manuscripts/mark-map/readme.md +++ b/docs/manuscripts/mark-map/readme.md @@ -7,10 +7,7 @@ - 计算机组成原理 - 计算机网络 - [//]: # (xmind在线加载时间太长) [//]: # () [//]: # () [//]: # () - - diff --git a/docs/manuscripts/os/readme.md b/docs/manuscripts/os/readme.md index 80109d6..36f6f44 100644 --- a/docs/manuscripts/os/readme.md +++ b/docs/manuscripts/os/readme.md @@ -9,8 +9,6 @@ 输入、输出管理 ``` - - ## 系统概述 - 引论 @@ -20,13 +18,11 @@ ## 进程管理 - - 进程和线程 - 处理机调度 - 进程同步 - 死锁 - ## 内存管理 - 引论 @@ -40,7 +36,6 @@ - 磁盘管理 - 一些总结 - ## 输入、输出管理 - 基本概述 @@ -48,8 +43,6 @@ - 高速缓存和缓冲区 - 一些总结 - - ## 参考资料 - 《计算机操作系统》 第四版 汤小丹、梁红兵、汤子瀛著 diff --git a/docs/manuscripts/os/内存管理/1.引论.md b/docs/manuscripts/os/内存管理/1.引论.md index a223d9f..f95d628 100644 --- a/docs/manuscripts/os/内存管理/1.引论.md +++ b/docs/manuscripts/os/内存管理/1.引论.md @@ -1,3 +1,3 @@ -# 引论 +# 引论 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/内存管理/2.虚拟内存.md b/docs/manuscripts/os/内存管理/2.虚拟内存.md index bf27c18..79f6430 100644 --- a/docs/manuscripts/os/内存管理/2.虚拟内存.md +++ b/docs/manuscripts/os/内存管理/2.虚拟内存.md @@ -1,3 +1,3 @@ -# 虚拟内存 +# 虚拟内存 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/内存管理/3.一些总结.md b/docs/manuscripts/os/内存管理/3.一些总结.md index 0e7e117..b78efa4 100644 --- a/docs/manuscripts/os/内存管理/3.一些总结.md +++ b/docs/manuscripts/os/内存管理/3.一些总结.md @@ -1,3 +1,3 @@ -# 一些总结 +# 一些总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/文件管理/1.基本概念.md b/docs/manuscripts/os/文件管理/1.基本概念.md index 6863856..8788987 100644 --- a/docs/manuscripts/os/文件管理/1.基本概念.md +++ b/docs/manuscripts/os/文件管理/1.基本概念.md @@ -1,3 +1,3 @@ -# 基本概念 +# 基本概念 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/文件管理/2.文件系统.md b/docs/manuscripts/os/文件管理/2.文件系统.md index 0b119f1..e13514b 100644 --- a/docs/manuscripts/os/文件管理/2.文件系统.md +++ b/docs/manuscripts/os/文件管理/2.文件系统.md @@ -1,3 +1,3 @@ -# 文件系统 +# 文件系统 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/文件管理/3.磁盘管理.md b/docs/manuscripts/os/文件管理/3.磁盘管理.md index 7d924b2..02200ad 100644 --- a/docs/manuscripts/os/文件管理/3.磁盘管理.md +++ b/docs/manuscripts/os/文件管理/3.磁盘管理.md @@ -1,3 +1,3 @@ -# 磁盘管理 +# 磁盘管理 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/文件管理/4.一些总结.md b/docs/manuscripts/os/文件管理/4.一些总结.md index 0e7e117..b78efa4 100644 --- a/docs/manuscripts/os/文件管理/4.一些总结.md +++ b/docs/manuscripts/os/文件管理/4.一些总结.md @@ -1,3 +1,3 @@ -# 一些总结 +# 一些总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/系统概述/1.操作系统引论.md b/docs/manuscripts/os/系统概述/1.操作系统引论.md index d5ceb6d..2892565 100644 --- a/docs/manuscripts/os/系统概述/1.操作系统引论.md +++ b/docs/manuscripts/os/系统概述/1.操作系统引论.md @@ -125,7 +125,7 @@ - 用户独占主机(一台计算机的全部资源由上机用户所独占),不会出现因资源已经被其他用户占用而等待的现象,但是资源利用率低; - CPU等待手工操作,CPU及内存等资源是空闲的,资源利用也不充分 -由于上面两个突显的缺点,**人工操作的方式严重降低了计算机资源的利用率,包括软件和硬件资源,即人机矛盾; ** 虽然CPU 的速度在迅速提高,但是I/O设备的比速度却提高 缓慢,使得CPU与I/O设备之间速度不匹配问题更加突出。**唯一的解决办法就是用高速的机器代替相对较慢的手工操作来对作业进行控制。** 先后出现过通道技术、缓冲技术、脱机输入/输出技术 +由于上面两个突显的缺点,**人工操作的方式严重降低了计算机资源的利用率,包括软件和硬件资源,即人机矛盾;** 虽然CPU 的速度在迅速提高,但是I/O设备的比速度却提高 缓慢,使得CPU与I/O设备之间速度不匹配问题更加突出。**唯一的解决办法就是用高速的机器代替相对较慢的手工操作来对作业进行控制。** 先后出现过通道技术、缓冲技术、脱机输入/输出技术 #### 脱机处理阶段 @@ -137,7 +137,7 @@ 单道批处理系统的显著特征: -- **自动性** 在顺序的情况下,在磁带上的一批作业任务能够自动地逐个依次有序运行,不需要人工干预; +- **自动性** 在顺序的情况下,在磁带上的一批作业任务能够自动地逐个依次有序运行,不需要人工干预; - **顺序性** 各道作业都是顺序进入内存中,完成的顺序和进入内存顺序,在正常情况下是完全相同的。可以理解为类似队列的方式,先调入内存的作业先完成; - **单道性** 内存中仅仅只有一道程序运行,监督程序每次从磁带上只调用一道程序进入内存运行。只有当程序完成或者发生异常时,才会更换后续程序进入内存中; @@ -168,9 +168,8 @@ - **资源利用率高** - **系统吞吐量大** - - CPU和其他资源保持“忙碌”状态(主要原因); - - 仅仅当作业完成时或者运行不下去时才进行切换,系统开销小(主要原因); - + - CPU和其他资源保持“忙碌”状态(主要原因); + - 仅仅当作业完成时或者运行不下去时才进行切换,系统开销小(主要原因); - **平均周转时间长** 需要排队依次处理,响应时间长 - **无交互能力** 修改和调试程序极其不方便,用户既不能了解程序的运行情况,也不能控制计算机; @@ -234,8 +233,6 @@ - 周期性实时任务和非周期性实时任务 - 硬实时任务和软实时任务 - - ## 操作系统的基本特性 > 例如批处理系统 有高资源利用率和系统吞吐量特点,分时系统能够获得及时响应,实时系统具有实时的特征。横向比较,不同操作系统之间功能具有**并发、共享、虚拟、异步**的基本特征 @@ -250,8 +247,6 @@ > 进程:在系统中能独立运行并作为**资源分配的基本单位**,由一组机器指令、数据和堆栈等组合而成,是一个能独立运行的活动实体 - - ### 共享(Sharing) ### 虚拟(Virtual) @@ -265,4 +260,3 @@ > 引入操作系统的主要目的:为多道程序的运行提供良好的运行环境,保证多道程序能够有条不紊地、高效地运行,最大程度的提高系统中各种资源的利用率 ## 操作系统的结构设计 - diff --git a/docs/manuscripts/os/系统概述/2.发展和分类.md b/docs/manuscripts/os/系统概述/2.发展和分类.md index 6e66785..7553e9b 100644 --- a/docs/manuscripts/os/系统概述/2.发展和分类.md +++ b/docs/manuscripts/os/系统概述/2.发展和分类.md @@ -1,3 +1,3 @@ -# 发展和分类 +# 发展和分类 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/系统概述/3.运行环境.md b/docs/manuscripts/os/系统概述/3.运行环境.md index 767659f..8b9c0fe 100644 --- a/docs/manuscripts/os/系统概述/3.运行环境.md +++ b/docs/manuscripts/os/系统概述/3.运行环境.md @@ -1,3 +1,3 @@ -# 运行环境 +# 运行环境 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/系统概述/4.体系结构.md b/docs/manuscripts/os/系统概述/4.体系结构.md index 64a428b..aa3d473 100644 --- a/docs/manuscripts/os/系统概述/4.体系结构.md +++ b/docs/manuscripts/os/系统概述/4.体系结构.md @@ -1,3 +1,3 @@ -# 体系结构 +# 体系结构 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/输入、输出管理/1.基本概述.md b/docs/manuscripts/os/输入、输出管理/1.基本概述.md index af7c927..44685a5 100644 --- a/docs/manuscripts/os/输入、输出管理/1.基本概述.md +++ b/docs/manuscripts/os/输入、输出管理/1.基本概述.md @@ -1,3 +1,3 @@ -# 基本概述 +# 基本概述 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/输入、输出管理/2.核心子系统.md b/docs/manuscripts/os/输入、输出管理/2.核心子系统.md index 5865580..d033f4c 100644 --- a/docs/manuscripts/os/输入、输出管理/2.核心子系统.md +++ b/docs/manuscripts/os/输入、输出管理/2.核心子系统.md @@ -1,3 +1,3 @@ -# 核心子系统 +# 核心子系统 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/输入、输出管理/3.高速缓存和缓冲区.md b/docs/manuscripts/os/输入、输出管理/3.高速缓存和缓冲区.md index bb55f44..56425b2 100644 --- a/docs/manuscripts/os/输入、输出管理/3.高速缓存和缓冲区.md +++ b/docs/manuscripts/os/输入、输出管理/3.高速缓存和缓冲区.md @@ -1,3 +1,3 @@ -# 高速缓存和缓冲区 +# 高速缓存和缓冲区 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/输入、输出管理/4.一些总结.md b/docs/manuscripts/os/输入、输出管理/4.一些总结.md index 0e7e117..b78efa4 100644 --- a/docs/manuscripts/os/输入、输出管理/4.一些总结.md +++ b/docs/manuscripts/os/输入、输出管理/4.一些总结.md @@ -1,3 +1,3 @@ -# 一些总结 +# 一些总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/进程管理/1.进程和线程.md b/docs/manuscripts/os/进程管理/1.进程和线程.md index aec5b16..3fc49ef 100644 --- a/docs/manuscripts/os/进程管理/1.进程和线程.md +++ b/docs/manuscripts/os/进程管理/1.进程和线程.md @@ -1,3 +1,3 @@ -# 进程和线程 +# 进程和线程 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/进程管理/2.处理机调度.md b/docs/manuscripts/os/进程管理/2.处理机调度.md index 5c0484e..f173f20 100644 --- a/docs/manuscripts/os/进程管理/2.处理机调度.md +++ b/docs/manuscripts/os/进程管理/2.处理机调度.md @@ -1,3 +1,3 @@ -# 处理机调度 +# 处理机调度 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/进程管理/3.进程同步.md b/docs/manuscripts/os/进程管理/3.进程同步.md index 6b3fde1..02a331d 100644 --- a/docs/manuscripts/os/进程管理/3.进程同步.md +++ b/docs/manuscripts/os/进程管理/3.进程同步.md @@ -1,3 +1,3 @@ -# 进程同步 +# 进程同步 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/进程管理/4.死锁.md b/docs/manuscripts/os/进程管理/4.死锁.md index 6eacbac..04ef5a9 100644 --- a/docs/manuscripts/os/进程管理/4.死锁.md +++ b/docs/manuscripts/os/进程管理/4.死锁.md @@ -1,3 +1,3 @@ -# 死锁 +# 死锁 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/os/进程管理/5.一些总结.md b/docs/manuscripts/os/进程管理/5.一些总结.md index 0e7e117..b78efa4 100644 --- a/docs/manuscripts/os/进程管理/5.一些总结.md +++ b/docs/manuscripts/os/进程管理/5.一些总结.md @@ -1,3 +1,3 @@ -# 一些总结 +# 一些总结 -努力赶稿中,等等我呀... \ No newline at end of file +努力赶稿中,等等我呀... diff --git a/docs/manuscripts/readme.md b/docs/manuscripts/readme.md index e01849a..7e4ad18 100644 --- a/docs/manuscripts/readme.md +++ b/docs/manuscripts/readme.md @@ -1,3 +1,3 @@ # 408冲 - \ No newline at end of file + diff --git a/docs/quick-start.md b/docs/quick-start.md index 87e16d6..c2c2b8c 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -3,7 +3,7 @@
- 关注公众号 @@ -15,30 +15,11 @@ - ## 写在最前面 **缺少有效访问链接的代表尚未完成,大家善用快捷键`Ctrl+F`** - - - - ## 学习建议 - 注意学科学习顺序,建议:数据结构 --> 操作系统、计组并行 --> 计算机网络 - 学习切忌浮于表面,戒骄戒躁。408考试知识点多、杂,非常容易忘,**抓大放小、先易后难、反复多次** - - - - - - - - - - - - - - diff --git a/docs/readme.md b/docs/readme.md index 70a9e02..0fc0d7b 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -97,49 +97,39 @@ yarn install yarn run dev ``` + ::: 查看项目启动日志并访问:[http://127.0.0.1:4200](http://localhost:4200),开启学习之旅吧~ - ### 在线浏览 - 稳定版: - > 网站无法访问时,建议通过科学上网访问备用网络 - Github: - Netlify: - Vercel: - - - ### 提交记录 - ### 赞赏列表 - -以下排名不分先后! [传送门→]() **赞赏过的一定要微信跟我说呀!!!!!!** - +以下排名不分先后! **赞赏过的一定要微信跟我说呀!!!!!!** - - ### 赞助商 -**以下排名不分先后! 还木有收到赞助,哈哈哈,先留坑** - +以下排名不分先后! 还木有收到赞助,哈哈哈,先留坑 ### 贡献 @@ -147,15 +137,12 @@ yarn run dev [![contributors](https://contrib.rocks/image?repo=142vip/408CSFamily)](https://github.com/142vip/408CSFamily/graphs/contributors) - ### 趋势
Star History
- - ### 联系作者 若系列文章对你有所帮助,欢迎订阅公众号或微信”骚扰“,获取更多内容。**商务合作请备注来意** @@ -163,7 +150,7 @@ yarn run dev
- 关注公众号 @@ -240,6 +227,3 @@ yarn run dev 交流/加群/互看朋友圈, 当然:**聊天 /提问 /建议 /提需求** 可以在公众号直接**私信**,后台可以看到。有时间即会回复,偶尔的延迟和疏漏还请小伙伴们谅解,蟹蟹。 - - - diff --git a/docs/wechat-list.md b/docs/wechat-list.md index ec336c5..2b2cca2 100644 --- a/docs/wechat-list.md +++ b/docs/wechat-list.md @@ -4,101 +4,76 @@ ### 2月 -- [【2021-02-07】被妹妹支配的一周,晚上差点连家都回不去..](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485376&idx=1&sn=049a5df5cb97786e80aded38a1bf3732&chksm=fcdfbe4ccba8375a52cb8d7077836216e5f5f41ee9453aebf524eb0a5d8a5db48cbabc11f3e4&token=1356818265&lang=zh_CN#rd) -- [【2021-02-11】【新年快乐】程序员的2020,就这样悄咪咪地溜走了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485404&idx=1&sn=276100858df23daf987dbc68997477df&chksm=fcdfbe50cba837460079fc9ab414754a49668f82dc0f6a5a41ec320d3e5dd77c1a8c271e061b&token=1356818265&lang=zh_CN#rd) -- [【2021-02-13】抢红包、拼手气来啦,之前答应的抽奖变成新年红包啦~](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485420&idx=1&sn=26c0e3690363af5dddd805ae417eeee9&chksm=fcdfbe60cba8377645e44333ccbe35147b9844578008e5699aba62b82c12fc03634e2d68781c&token=1356818265&lang=zh_CN#rd) +- [被妹妹支配的一周,晚上差点连家都回不去..](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485376&idx=1&sn=049a5df5cb97786e80aded38a1bf3732&chksm=fcdfbe4ccba8375a52cb8d7077836216e5f5f41ee9453aebf524eb0a5d8a5db48cbabc11f3e4&token=1356818265&lang=zh_CN#rd) +- [新年快乐,程序员的2020,就这样悄咪咪地溜走了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485404&idx=1&sn=276100858df23daf987dbc68997477df&chksm=fcdfbe50cba837460079fc9ab414754a49668f82dc0f6a5a41ec320d3e5dd77c1a8c271e061b&token=1356818265&lang=zh_CN#rd) +- [抢红包、拼手气来啦,之前答应的抽奖变成新年红包啦~](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485420&idx=1&sn=26c0e3690363af5dddd805ae417eeee9&chksm=fcdfbe60cba8377645e44333ccbe35147b9844578008e5699aba62b82c12fc03634e2d68781c&token=1356818265&lang=zh_CN#rd) ### 1月 -- [【2021-01-06】谁在看小王子呀~](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485228&idx=1&sn=1c30866a209af2a5eb927fd7bd63cc8b&chksm=fcdfbea0cba837b6d4cf9865b72a6a1553c4d9b6a6cce369bb09f66730ab37ec649071e7ab7c&token=1356818265&lang=zh_CN#rd) -- [【2021-01-15】2020小结,没事就点点看看呗,反正小目标都没完成](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485249&idx=1&sn=dadf2a6dbed1879bbd98c62491436a9c&chksm=fcdfbecdcba837db5c11b8023ffa7ad6cf5a47c03027a0029604a50d0a77c75908efc05af39a&token=1356818265&lang=zh_CN#rd) -- [【2021-01-17】搞波大的,浅谈深拷贝——文末有彩蛋](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485258&idx=1&sn=fb71007a5feed8e18674be27b1c749ab&chksm=fcdfbec6cba837d099e90a5f45781ee8cac474388e25ad9383a4fbc05fdb16a8e1377265c018&token=1356818265&lang=zh_CN#rd) -- [【2021-01-18】到底该如何发布Npm插件,常用指令在这里](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485277&idx=1&sn=9eb7c3cef21ace2cc5853e382f2bb03f&chksm=fcdfbed1cba837c7839f3b57836f43b3425c8b5a7888f543bf4a1dd8b39cd82ed7d51a24a685&token=1356818265&lang=zh_CN#rd) -- [【2021-01-20】好用的AntDocs,也来学着用一下,基本过程整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485291&idx=1&sn=19f13df8131a9f662973f2d9240c1eab&chksm=fcdfbee7cba837f180d8ad30735cd61e6c73fe195e63d46046bb24f80e1536aa0a585c3e1015&token=1356818265&lang=zh_CN#rd) -- [【2021-01-27】【持续更新】从查找算法开始数据结构入门,大家都在掘金等你](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485318&idx=1&sn=6ae5fc9f1cf994818ff89d53a926761e&chksm=fcdfbe0acba8371c9d0025008084857cf14c52b01dfb1b9460d3388ba543c36da2abcbf90216&token=1356818265&lang=zh_CN#rd) -- [【2021-01-30】ORM框架入门之Sequelize,我快翻译不动了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485341&idx=1&sn=fc493c28ab138056567e916b769ddbf2&chksm=fcdfbe11cba8370793e8e0d71e7766f4e1e7f3e8672921d6b98757f7d7b271b290f3edc65d6f&token=1356818265&lang=zh_CN#rd) - - - - +- [谁在看小王子呀~](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485228&idx=1&sn=1c30866a209af2a5eb927fd7bd63cc8b&chksm=fcdfbea0cba837b6d4cf9865b72a6a1553c4d9b6a6cce369bb09f66730ab37ec649071e7ab7c&token=1356818265&lang=zh_CN#rd) +- [2020小结,没事就点点看看呗,反正小目标都没完成](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485249&idx=1&sn=dadf2a6dbed1879bbd98c62491436a9c&chksm=fcdfbecdcba837db5c11b8023ffa7ad6cf5a47c03027a0029604a50d0a77c75908efc05af39a&token=1356818265&lang=zh_CN#rd) +- [搞波大的,浅谈深拷贝——文末有彩蛋](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485258&idx=1&sn=fb71007a5feed8e18674be27b1c749ab&chksm=fcdfbec6cba837d099e90a5f45781ee8cac474388e25ad9383a4fbc05fdb16a8e1377265c018&token=1356818265&lang=zh_CN#rd) +- [到底该如何发布Npm插件,常用指令在这里](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485277&idx=1&sn=9eb7c3cef21ace2cc5853e382f2bb03f&chksm=fcdfbed1cba837c7839f3b57836f43b3425c8b5a7888f543bf4a1dd8b39cd82ed7d51a24a685&token=1356818265&lang=zh_CN#rd) +- [好用的AntDocs,也来学着用一下,基本过程整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485291&idx=1&sn=19f13df8131a9f662973f2d9240c1eab&chksm=fcdfbee7cba837f180d8ad30735cd61e6c73fe195e63d46046bb24f80e1536aa0a585c3e1015&token=1356818265&lang=zh_CN#rd) +- [持续更新,从查找算法开始数据结构入门,大家都在掘金等你](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485318&idx=1&sn=6ae5fc9f1cf994818ff89d53a926761e&chksm=fcdfbe0acba8371c9d0025008084857cf14c52b01dfb1b9460d3388ba543c36da2abcbf90216&token=1356818265&lang=zh_CN#rd) +- [ORM框架入门之Sequelize,我快翻译不动了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485341&idx=1&sn=fc493c28ab138056567e916b769ddbf2&chksm=fcdfbe11cba8370793e8e0d71e7766f4e1e7f3e8672921d6b98757f7d7b271b290f3edc65d6f&token=1356818265&lang=zh_CN#rd) ## 2020年 - ### 12月 -- [【2020-12-06】周末小记——忆旧友、吃火锅,也会感慨](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485080&idx=2&sn=bdc551f2e9bf54dc01881979339af8ad&chksm=fcdfbf14cba836022a05854547cbca03b5a08b912a0e0f195d4856d6b53ecd78aee2f167b515&token=1581389686&lang=zh_CN#rd) -- [【2020-12-10】上火、牙疼,也要砍程序媛一刀](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485100&idx=1&sn=e7c0c41229d51ebfab2939deb1751672&chksm=fcdfbf20cba836364da35ab5acfed076876aae486126bc1c41cdd2502cc89a41cbde7c645610&token=1054397108&lang=zh_CN#rd) -- [【2020-12-17】今晚不蹦迪,来聊一聊个人项目的接口返回](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485136&idx=1&sn=4619fb835e6d57e106ab01116012662a&chksm=fcdfbf5ccba8364aecddf14d11ed8ba36f38050b83b30b8d46e10f86b164aab05322b8455b36&token=755050934&lang=zh_CN#rd) -- [【2020-12-20】事情,从英吉利海岸的那杯卡布奇诺美式咖啡说起](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485180&idx=1&sn=15ab9be3e15130103f26c919cbe0b605&chksm=fcdfbf70cba83666d287acc35485d02ddf67bacad6ea46d9ef04521f9f429fcb015d371c918e&token=1356818265&lang=zh_CN#rd) - - +- [周末小记——忆旧友、吃火锅,也会感慨](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485080&idx=2&sn=bdc551f2e9bf54dc01881979339af8ad&chksm=fcdfbf14cba836022a05854547cbca03b5a08b912a0e0f195d4856d6b53ecd78aee2f167b515&token=1581389686&lang=zh_CN#rd) +- [上火、牙疼,也要砍程序媛一刀](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485100&idx=1&sn=e7c0c41229d51ebfab2939deb1751672&chksm=fcdfbf20cba836364da35ab5acfed076876aae486126bc1c41cdd2502cc89a41cbde7c645610&token=1054397108&lang=zh_CN#rd) +- [今晚不蹦迪,来聊一聊个人项目的接口返回](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485136&idx=1&sn=4619fb835e6d57e106ab01116012662a&chksm=fcdfbf5ccba8364aecddf14d11ed8ba36f38050b83b30b8d46e10f86b164aab05322b8455b36&token=755050934&lang=zh_CN#rd) +- [事情,从英吉利海岸的那杯卡布奇诺美式咖啡说起](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485180&idx=1&sn=15ab9be3e15130103f26c919cbe0b605&chksm=fcdfbf70cba83666d287acc35485d02ddf67bacad6ea46d9ef04521f9f429fcb015d371c918e&token=1356818265&lang=zh_CN#rd) ### 11月 -- [【2020-11-01】11月,你好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485002&idx=1&sn=3760eba58f7ded433b71bec48b89a681&chksm=fcdfbfc6cba836d0b7db1f2aa5a4a884f68f8ce20a59aa44b4ac46c59eb4dd1c233079241a4a&token=368257571&lang=zh_CN#rd) -- [【2020-11-15】她来了她来了,她带着剪了三遍的视频来了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485042&idx=1&sn=181ae5062c31ee7931390607b6f10358&chksm=fcdfbffecba836e8275c849007470db6964f7cd675af59fe73c94369334d17d4840e8c0413d5&token=898438314&lang=zh_CN#rd) -- [【2020-11-18】陪我一路的小姐姐,谢谢啦~ 我大意了呀,没有闪](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485053&idx=1&sn=ed2fe0de87b70781cdb7755ef4726340&chksm=fcdfbff1cba836e7165dc53722aaf96ef38d8f43cfadadcb4695d8ff430ea64619caada81cfa&token=1939941957&lang=zh_CN#rd) -- [【2020-11-30】11月的尾巴,12月你好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485066&idx=1&sn=1d357917f548a6d977af96c6582db527&chksm=fcdfbf06cba836103152f7a3fdfbf97c1be2472a84f824cbddd532c15aefe14c71b3b076233f&token=831506871&lang=zh_CN#rd) - - +- [11月,你好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485002&idx=1&sn=3760eba58f7ded433b71bec48b89a681&chksm=fcdfbfc6cba836d0b7db1f2aa5a4a884f68f8ce20a59aa44b4ac46c59eb4dd1c233079241a4a&token=368257571&lang=zh_CN#rd) +- [她来了她来了,她带着剪了三遍的视频来了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485042&idx=1&sn=181ae5062c31ee7931390607b6f10358&chksm=fcdfbffecba836e8275c849007470db6964f7cd675af59fe73c94369334d17d4840e8c0413d5&token=898438314&lang=zh_CN#rd) +- [陪我一路的小姐姐,谢谢啦~ 我大意了呀,没有闪](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485053&idx=1&sn=ed2fe0de87b70781cdb7755ef4726340&chksm=fcdfbff1cba836e7165dc53722aaf96ef38d8f43cfadadcb4695d8ff430ea64619caada81cfa&token=1939941957&lang=zh_CN#rd) +- [11月的尾巴,12月你好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485066&idx=1&sn=1d357917f548a6d977af96c6582db527&chksm=fcdfbf06cba836103152f7a3fdfbf97c1be2472a84f824cbddd532c15aefe14c71b3b076233f&token=831506871&lang=zh_CN#rd) ### 10月 -- [【2020-10-07】时间太快,溜了溜了,杭州见](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484943&idx=1&sn=ad37db87dc40f381fd18cc828e492384&chksm=fcdfbf83cba8369598fc2773b63df235a9719b43749e7daab753c621fef5af4fba054dbb46ea&token=368257571&lang=zh_CN#rd) -- [【2020-10-14】写不了代码就不写嘛](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484951&idx=1&sn=edddf3d6c8f3fc6dd1d14063b536c732&chksm=fcdfbf9bcba8368d81ddffcbd258f7e4b7fb573d2a8963859e1b156e8a5f5d81f5629c49be6e&token=368257571&lang=zh_CN#rd) -- [【2020-10-18】我不行了,这号关注量男女7:3 还怎么相亲嘛?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484968&idx=1&sn=d37960ed81044fbf314440af85049d65&chksm=fcdfbfa4cba836b25082535910f7137d1513d834d54fbfadf48a433b29511ccf4d532f19b88a&token=368257571&lang=zh_CN#rd) -- [【2020-10-26】悄悄接你下班,陪你回家](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484988&idx=1&sn=947c487946fa3574d33e9c6861a1ee28&chksm=fcdfbfb0cba836a626d2efa904a5177c2e0916c381b26c89b6dcfc610a380b906d4480f7cc9b&token=368257571&lang=zh_CN#rd) - - +- [时间太快,溜了溜了,杭州见](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484943&idx=1&sn=ad37db87dc40f381fd18cc828e492384&chksm=fcdfbf83cba8369598fc2773b63df235a9719b43749e7daab753c621fef5af4fba054dbb46ea&token=368257571&lang=zh_CN#rd) +- [写不了代码就不写嘛](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484951&idx=1&sn=edddf3d6c8f3fc6dd1d14063b536c732&chksm=fcdfbf9bcba8368d81ddffcbd258f7e4b7fb573d2a8963859e1b156e8a5f5d81f5629c49be6e&token=368257571&lang=zh_CN#rd) +- [我不行了,这号关注量男女7:3 还怎么相亲嘛?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484968&idx=1&sn=d37960ed81044fbf314440af85049d65&chksm=fcdfbfa4cba836b25082535910f7137d1513d834d54fbfadf48a433b29511ccf4d532f19b88a&token=368257571&lang=zh_CN#rd) +- [悄悄接你下班,陪你回家](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484988&idx=1&sn=947c487946fa3574d33e9c6861a1ee28&chksm=fcdfbfb0cba836a626d2efa904a5177c2e0916c381b26c89b6dcfc610a380b906d4480f7cc9b&token=368257571&lang=zh_CN#rd) ### 9月 -- [【2020-09-01】Redis的简单安装和部署 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484600&idx=1&sn=489aa1bd12487b0bf8f2a7694f4ca1aa&chksm=fcdfbd34cba83422f0afee027747d9e95773e093fa3a24225c2729029c4392bf42043964782f&token=1613702159&lang=zh_CN#rd) -- [【2020-09-01】就很像?? ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484600&idx=2&sn=a9962c6ca3a5eddd085bcd15617f64d9&chksm=fcdfbd34cba83422b987020a858b7cf31bfde6033642d697d5a00ad9ed618f3cf14deb207d67&token=1613702159&lang=zh_CN#rd) -- [【2020-09-03】shell编程基础整理 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484702&idx=1&sn=6e3e862153755d9e61f5f4ebf220381d&chksm=fcdfbc92cba835844e8b6fd37d86a34ccf83342895f448c88ba5b62db974eb536a8e74a121aa&token=1613702159&lang=zh_CN#rd) -- [【2020-09-03】大学四年建站用过的云服务器都在这里了 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484702&idx=2&sn=c7589eecbe58ff8939f72c0ff0bf567d&chksm=fcdfbc92cba83584b03dfeea7290606ce8249b0c3105b0b3b95a9087c77e3b1c7f863d8e30f9&token=1613702159&lang=zh_CN#rd) -- [【2020-09-04】面试复盘和思考 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484711&idx=1&sn=bf362439ccfad04da53ce65c824a988d&chksm=fcdfbcabcba835bddc43c40fd3a454793adf7849a5d5bb356825d481b82ae3e58a749859502c&token=1613702159&lang=zh_CN#rd) -- [【2020-09-06】朋友是“无用”的,不是你瞧不起我,就是我瞧不起你 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484759&idx=1&sn=e0f8a7a70ddede75d94b202ddc6106d6&chksm=fcdfbcdbcba835cd2138658d750f7e09a820b34daf4624f253a21a11b5de56635d35e4c0df19&token=1613702159&lang=zh_CN#rd) -- [【2020-09-06】GitHub简单使用 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484759&idx=2&sn=ade86739c94f99f944a3d387bc7e13ef&chksm=fcdfbcdbcba835cd192c3b7b7eeea8f5dbb16b2b2fa58b6e2094184f5aa3341927a6d1fad6f8&token=1613702159&lang=zh_CN#rd) -- [【2020-09-07】MySQL日志类型把我难哭了,你学废了吗?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484771&idx=1&sn=6ae4c6e8d333b0e1aa5cd1aee161d9b8&chksm=fcdfbcefcba835f94e3c0abc189477f241f675f38a63eb03bd320447e89da39cb08b72038ba3&token=1613702159&lang=zh_CN#rd) -- [【2020-09-11】向各位汇报这周状态,再也不敢鸽了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484783&idx=1&sn=b9e82a2c2b04b7050d0659085af537ef&chksm=fcdfbce3cba835f5e692f5ffbb16505dbf3b5ccc9bb0bdf4b3f467629b293d0e0ce3086ec8dc&token=639111151&lang=zh_CN#rd) -- [【2020-09-11】向各位汇报这周状态,再也不敢鸽了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484783&idx=1&sn=b9e82a2c2b04b7050d0659085af537ef&chksm=fcdfbce3cba835f5e692f5ffbb16505dbf3b5ccc9bb0bdf4b3f467629b293d0e0ce3086ec8dc&token=639111151&lang=zh_CN#rd) -- [【2020-09-12】向各位汇报,再也不敢鸽了,人生处处有惊喜](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484784&idx=1&sn=ae73f1f4e53b622039a75ec41cabe378&chksm=fcdfbcfccba835eafefe304913e4078cf8dfac22f62fd9d686b307bbdf46d147016f5e876e05&token=639111151&lang=zh_CN#rd) -- [【2020-09-13】来来来,无厘头技术(水)文,各种尬。简简单单评价一下](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=1&sn=10d26a600112ec4f95b3b3f470955744&chksm=fcdfbc03cba83515b07f0ae6cee791d1fb5fd619364cff3a17a4deab91333f0a6277b09a66a9&token=639111151&lang=zh_CN#rd) -- [【2020-09-13】基础Brew和Tree的安装实录](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=2&sn=94a6455ed6b17fa5b27e96358e935803&chksm=fcdfbc03cba83515d13dcfc2dea2445085a34ff4360e0a367fd914bb04bc6ba18a780a0cd2d2&token=639111151&lang=zh_CN#rd) -- [【2020-09-13】PM2进程管理,给我学!](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=3&sn=38a289efffda9510b5ff04c5bed0663e&chksm=fcdfbc03cba835154c888b9d7f86eac85c250eefb9d053687173274373f2f8d7b19fc307e76a&token=639111151&lang=zh_CN#rd) -- [【2020-09-14】数据结构,一定要学废了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484823&idx=1&sn=d41bb8da02585cf9ea8d0b3ef27e3dbb&chksm=fcdfbc1bcba8350d84ba2f01eaf187cbaa2d4cf5a9078beb1f2fafe94edb0126c82595ed8191&token=368257571&lang=zh_CN#rd) -- [【2020-09-16】ELK基础概念与常用架构整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484837&idx=1&sn=7f0de3eeea3fc6ee299587704f5c44cd&chksm=fcdfbc29cba8353fd894582da7ae2c93b5920c4dbb1e197b011a817dc0962e317842a32d5560&token=368257571&lang=zh_CN#rd) -- [【2020-09-17】分享书上一段话,问一个问题](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484850&idx=1&sn=7af55ef3a7d843d9c43de6d6c7911da3&chksm=fcdfbc3ecba835287b2c644cda606454a713d370fbd7d14714b22a04277f7a7784b96b8b277e&token=368257571&lang=zh_CN#rd) -- [【2020-09-17】看源码遇到的三个知识点,一个也没懂](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484850&idx=2&sn=c59839c677d7c9652a09d1f8c70ef8d6&chksm=fcdfbc3ecba83528cf8271a2615129340a6f11954b6d9396160d0fb2c41593253d5e3510a031&token=368257571&lang=zh_CN#rd) -- [【2020-09-20】express()函数整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484865&idx=2&sn=63e6b669341217135013816464dd5bd9&chksm=fcdfbc4dcba8355b4de0f712047709425a35fa3b122378b31f0e4db3afb82dfd38872862aab4&token=368257571&lang=zh_CN#rd) -- [【2020-09-22】入秋了,安好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484865&idx=1&sn=e39e3547da49f40e1b64deadf9a9cfef&chksm=fcdfbc4dcba8355bfa9c8b9531a463fc652b764064528dd6c243f47a157b20e017bad3f410f4&token=368257571&lang=zh_CN#rd) -- [【2020-09-22】Nginx安装详解,我服务器上也是这样的](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484897&idx=1&sn=b1073522cfd3ce6ebbe85e85ad4e35e0&chksm=fcdfbc6dcba8357bdb212c9db1378a045d0dcfd95b79ed05688180f05d2b391f9b724d0d752f&token=368257571&lang=zh_CN#rd) -- [【2020-09-22】被攻击的一天](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484897&idx=2&sn=34c61ed01c6522d2861be3342ec12ad5&chksm=fcdfbc6dcba8357b76eb0fe6c502d932def6cd232297b010f9b2f9a1fca35c38df77dacce7f2&token=368257571&lang=zh_CN#rd) -- [【2020-09-26】跟父亲视频的一个半小时,聊到了我,也聊到了Ta](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484929&idx=1&sn=394783dd2bfd65da24ae6dcb89d69ec6&chksm=fcdfbf8dcba8369b926b7083bbe3515aa5857f7589acc3f9d6d4987c67539a76dbd6e3cb70a1&token=368257571&lang=zh_CN#rd) - +- [Redis的简单安装和部署](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484600&idx=1&sn=489aa1bd12487b0bf8f2a7694f4ca1aa&chksm=fcdfbd34cba83422f0afee027747d9e95773e093fa3a24225c2729029c4392bf42043964782f&token=1613702159&lang=zh_CN#rd) +- [就很像??](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484600&idx=2&sn=a9962c6ca3a5eddd085bcd15617f64d9&chksm=fcdfbd34cba83422b987020a858b7cf31bfde6033642d697d5a00ad9ed618f3cf14deb207d67&token=1613702159&lang=zh_CN#rd) +- [shell编程基础整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484702&idx=1&sn=6e3e862153755d9e61f5f4ebf220381d&chksm=fcdfbc92cba835844e8b6fd37d86a34ccf83342895f448c88ba5b62db974eb536a8e74a121aa&token=1613702159&lang=zh_CN#rd) +- [大学四年建站用过的云服务器都在这里了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484702&idx=2&sn=c7589eecbe58ff8939f72c0ff0bf567d&chksm=fcdfbc92cba83584b03dfeea7290606ce8249b0c3105b0b3b95a9087c77e3b1c7f863d8e30f9&token=1613702159&lang=zh_CN#rd) +- [面试复盘和思考](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484711&idx=1&sn=bf362439ccfad04da53ce65c824a988d&chksm=fcdfbcabcba835bddc43c40fd3a454793adf7849a5d5bb356825d481b82ae3e58a749859502c&token=1613702159&lang=zh_CN#rd) +- [朋友是“无用”的,不是你瞧不起我,就是我瞧不起你](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484759&idx=1&sn=e0f8a7a70ddede75d94b202ddc6106d6&chksm=fcdfbcdbcba835cd2138658d750f7e09a820b34daf4624f253a21a11b5de56635d35e4c0df19&token=1613702159&lang=zh_CN#rd) +- [GitHub简单使用](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484759&idx=2&sn=ade86739c94f99f944a3d387bc7e13ef&chksm=fcdfbcdbcba835cd192c3b7b7eeea8f5dbb16b2b2fa58b6e2094184f5aa3341927a6d1fad6f8&token=1613702159&lang=zh_CN#rd) +- [MySQL日志类型把我难哭了,你学废了吗?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484771&idx=1&sn=6ae4c6e8d333b0e1aa5cd1aee161d9b8&chksm=fcdfbcefcba835f94e3c0abc189477f241f675f38a63eb03bd320447e89da39cb08b72038ba3&token=1613702159&lang=zh_CN#rd) +- [向各位汇报这周状态,再也不敢鸽了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484783&idx=1&sn=b9e82a2c2b04b7050d0659085af537ef&chksm=fcdfbce3cba835f5e692f5ffbb16505dbf3b5ccc9bb0bdf4b3f467629b293d0e0ce3086ec8dc&token=639111151&lang=zh_CN#rd) +- [来来来,无厘头技术(水)文,各种尬。简简单单评价一下](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=1&sn=10d26a600112ec4f95b3b3f470955744&chksm=fcdfbc03cba83515b07f0ae6cee791d1fb5fd619364cff3a17a4deab91333f0a6277b09a66a9&token=639111151&lang=zh_CN#rd) +- [基础Brew和Tree的安装实录](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=2&sn=94a6455ed6b17fa5b27e96358e935803&chksm=fcdfbc03cba83515d13dcfc2dea2445085a34ff4360e0a367fd914bb04bc6ba18a780a0cd2d2&token=639111151&lang=zh_CN#rd) +- [PM2进程管理,给我学!](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=3&sn=38a289efffda9510b5ff04c5bed0663e&chksm=fcdfbc03cba835154c888b9d7f86eac85c250eefb9d053687173274373f2f8d7b19fc307e76a&token=639111151&lang=zh_CN#rd) +- [数据结构,一定要学废了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484823&idx=1&sn=d41bb8da02585cf9ea8d0b3ef27e3dbb&chksm=fcdfbc1bcba8350d84ba2f01eaf187cbaa2d4cf5a9078beb1f2fafe94edb0126c82595ed8191&token=368257571&lang=zh_CN#rd) +- [ELK基础概念与常用架构整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484837&idx=1&sn=7f0de3eeea3fc6ee299587704f5c44cd&chksm=fcdfbc29cba8353fd894582da7ae2c93b5920c4dbb1e197b011a817dc0962e317842a32d5560&token=368257571&lang=zh_CN#rd) +- [分享书上一段话,问一个问题](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484850&idx=1&sn=7af55ef3a7d843d9c43de6d6c7911da3&chksm=fcdfbc3ecba835287b2c644cda606454a713d370fbd7d14714b22a04277f7a7784b96b8b277e&token=368257571&lang=zh_CN#rd) +- [看源码遇到的三个知识点,一个也没懂](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484850&idx=2&sn=c59839c677d7c9652a09d1f8c70ef8d6&chksm=fcdfbc3ecba83528cf8271a2615129340a6f11954b6d9396160d0fb2c41593253d5e3510a031&token=368257571&lang=zh_CN#rd) +- [express函数整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484865&idx=2&sn=63e6b669341217135013816464dd5bd9&chksm=fcdfbc4dcba8355b4de0f712047709425a35fa3b122378b31f0e4db3afb82dfd38872862aab4&token=368257571&lang=zh_CN#rd) +- [入秋了,安好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484865&idx=1&sn=e39e3547da49f40e1b64deadf9a9cfef&chksm=fcdfbc4dcba8355bfa9c8b9531a463fc652b764064528dd6c243f47a157b20e017bad3f410f4&token=368257571&lang=zh_CN#rd) +- [Nginx安装详解,我服务器上也是这样的](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484897&idx=1&sn=b1073522cfd3ce6ebbe85e85ad4e35e0&chksm=fcdfbc6dcba8357bdb212c9db1378a045d0dcfd95b79ed05688180f05d2b391f9b724d0d752f&token=368257571&lang=zh_CN#rd) +- [被攻击的一天](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484897&idx=2&sn=34c61ed01c6522d2861be3342ec12ad5&chksm=fcdfbc6dcba8357b76eb0fe6c502d932def6cd232297b010f9b2f9a1fca35c38df77dacce7f2&token=368257571&lang=zh_CN#rd) +- [跟父亲视频的一个半小时,聊到了我,也聊到了Ta](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484929&idx=1&sn=394783dd2bfd65da24ae6dcb89d69ec6&chksm=fcdfbf8dcba8369b926b7083bbe3515aa5857f7589acc3f9d6d4987c67539a76dbd6e3cb70a1&token=368257571&lang=zh_CN#rd) ### 8月 -- [【2020-08-01】旧友相见,甚是怀念](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483790&idx=1&sn=76e13ac79ad498309542c9f41878bb1c&chksm=fcdfb802cba8311456ea9ff3309c4354055022cd0056b13c11fac44252231550e17a03f26f29&token=639111151&lang=zh_CN#rd) -- [【2020-08-03】JavaScript基础介绍和快速入门](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483805&idx=1&sn=4da4e0d3a2912aee146248c1d8f7f96f&chksm=fcdfb811cba83107fd8f08d3e35af7c72bf7d908d577ad83e45d80b0e9d1bbdbf16b1f169d64&token=639111151&lang=zh_CN#rd) +- [旧友相见,甚是怀念](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483790&idx=1&sn=76e13ac79ad498309542c9f41878bb1c&chksm=fcdfb802cba8311456ea9ff3309c4354055022cd0056b13c11fac44252231550e17a03f26f29&token=639111151&lang=zh_CN#rd) +- [JavaScript基础介绍和快速入门](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483805&idx=1&sn=4da4e0d3a2912aee146248c1d8f7f96f&chksm=fcdfb811cba83107fd8f08d3e35af7c72bf7d908d577ad83e45d80b0e9d1bbdbf16b1f169d64&token=639111151&lang=zh_CN#rd) ### 7月 -- [【2020-07-26】微信公众号我来了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483659&idx=1&sn=ac7b633a45ac06d388e0698163a2543e&chksm=fcdfb887cba8319151aedfa80c5b59d130838af81fe51c76e5c4926f82f4937b51c8c0c1470e&token=1304241434&lang=zh_CN#rd) -- [【2020-07-27】介绍一下,我在B站](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483760&idx=1&sn=30a9fa2a051079c5330039615950c34d&chksm=fcdfb8fccba831ea64644be501ecca3cea5846f16367faed9c84b44a30d9b6dc30456dae6548&token=1304241434&lang=zh_CN#rd) -- [【2020-07-28】五年了,我终于换了人生中的第一台MacBookPro](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483762&idx=1&sn=e9ea759f1c1589881cc3bd9cabddb70a&chksm=fcdfb8fecba831e8c4635a4cefd302977071ed11a4dda6161cf9ad8458865297194f87cb013a&token=1304241434&lang=zh_CN#rd) -- [【2020-07-29】工作中第一次被喷,我到底是如何应对的?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483770&idx=1&sn=6b760873a814f4e18baab415bee3d863&chksm=fcdfb8f6cba831e00802de653ff6723a0bb169a93fe3a6a9762ee62d75d8cd88409268db9047&token=1304241434&lang=zh_CN#rd) -- [【2020-07-31】CSDN关注100了,就这????](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483778&idx=1&sn=3d9f623c58d595f75d7092783a6c5abe&chksm=fcdfb80ecba83118e76de1ed88a5be51229e4145182aee6e0bcc13e4697707cf9f4609d8799d&token=1304241434&lang=zh_CN#rd) - - - - - - - - - - - +- [微信公众号我来了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483659&idx=1&sn=ac7b633a45ac06d388e0698163a2543e&chksm=fcdfb887cba8319151aedfa80c5b59d130838af81fe51c76e5c4926f82f4937b51c8c0c1470e&token=1304241434&lang=zh_CN#rd) +- [介绍一下,我在B站](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483760&idx=1&sn=30a9fa2a051079c5330039615950c34d&chksm=fcdfb8fccba831ea64644be501ecca3cea5846f16367faed9c84b44a30d9b6dc30456dae6548&token=1304241434&lang=zh_CN#rd) +- [五年了,我终于换了人生中的第一台MacBookPro](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483762&idx=1&sn=e9ea759f1c1589881cc3bd9cabddb70a&chksm=fcdfb8fecba831e8c4635a4cefd302977071ed11a4dda6161cf9ad8458865297194f87cb013a&token=1304241434&lang=zh_CN#rd) +- [工作中第一次被喷,我到底是如何应对的?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483770&idx=1&sn=6b760873a814f4e18baab415bee3d863&chksm=fcdfb8f6cba831e00802de653ff6723a0bb169a93fe3a6a9762ee62d75d8cd88409268db9047&token=1304241434&lang=zh_CN#rd) +- [CSDN关注100了,就这????](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483778&idx=1&sn=3d9f623c58d595f75d7092783a6c5abe&chksm=fcdfb80ecba83118e76de1ed88a5be51229e4145182aee6e0bcc13e4697707cf9f4609d8799d&token=1304241434&lang=zh_CN#rd) diff --git a/package.json b/package.json index 6058f4b..c92e4c9 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-vue": "^9.17.0", "husky": "^8.0.3", + "markdownlint-cli": "^0.37.0", "markmap-cli": "^0.15.4", "shelljs": "^0.8.5", "typescript": "^3.9.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20ecc0f..102b37e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ devDependencies: husky: specifier: ^8.0.3 version: 8.0.3 + markdownlint-cli: + specifier: ^0.37.0 + version: 0.37.0 markmap-cli: specifier: ^0.15.4 version: 0.15.4 @@ -1574,6 +1577,18 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -1902,6 +1917,13 @@ packages: fastq: 1.15.0 dev: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + /@pnpm/config.env-replace@1.1.0: resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -6087,6 +6109,14 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -6244,6 +6274,11 @@ packages: yargs: 16.2.0 dev: true + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + dev: true + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -6362,6 +6397,18 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 5.0.0 + path-scurry: 1.10.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -6779,6 +6826,11 @@ packages: engines: {node: '>=10'} dev: true + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /insane@2.6.2: resolution: {integrity: sha512-BqEL1CJsjJi+/C/zKZxv31zs3r6zkLH5Nz1WMFb7UBX2KHY2yXDpbFTSEmNHzomBbGDysIfkTX55A0mQZ2CQiw==} dependencies: @@ -7090,6 +7142,15 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} @@ -7566,6 +7627,17 @@ packages: resolution: {integrity: sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==} dev: true + /markdown-it@13.0.1: + resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: true + /markdown-it@13.0.2: resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} hasBin: true @@ -7577,6 +7649,35 @@ packages: uc.micro: 1.0.6 dev: true + /markdownlint-cli@0.37.0: + resolution: {integrity: sha512-hNKAc0bWBBuVhJbSWbUhRzavstiB4o1jh3JeSpwC4/dt6eJ54lRfYHRxVdzVp4qGWBKbeE6Pg490PFEfrKjqSg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + commander: 11.0.0 + get-stdin: 9.0.0 + glob: 10.3.10 + ignore: 5.2.4 + js-yaml: 4.1.0 + jsonc-parser: 3.2.0 + markdownlint: 0.31.1 + minimatch: 9.0.3 + run-con: 1.3.2 + dev: true + + /markdownlint-micromark@0.1.7: + resolution: {integrity: sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==} + engines: {node: '>=16'} + dev: true + + /markdownlint@0.31.1: + resolution: {integrity: sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==} + engines: {node: '>=16'} + dependencies: + markdown-it: 13.0.1 + markdownlint-micromark: 0.1.7 + dev: true + /marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} @@ -8013,6 +8114,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -8616,6 +8724,14 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.1 + minipass: 5.0.0 + dev: true + /path-to-regexp@1.8.0: resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} dependencies: @@ -9180,6 +9296,16 @@ packages: execa: 5.1.1 dev: true + /run-con@1.3.2: + resolution: {integrity: sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 4.1.1 + minimist: 1.2.8 + strip-json-comments: 3.1.1 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: diff --git a/scripts/lint b/scripts/lint index 961c95d..275cd2e 100755 --- a/scripts/lint +++ b/scripts/lint @@ -8,9 +8,18 @@ * - ./scripts/lint --fix */ -const { execShell } = require('./.exec') +const {execShell} = require('./.exec') const scriptName = process.argv[2] const fixed = scriptName != null ? '--fix' : ''; +// 格式化代码 +const lintCode = `eslint ${fixed} --ext .js,.ts,.vue --ignore-path .gitignore .`; + +// 遍历格式化docs目录下的markdown 文档 +const lintMd = 'find docs -type f -name \"*.md\" -print0 | xargs -0 -I {} markdownlint -c .markdownlint.js --fix {}'; + // 可以在--fix后指定目录 -(async() => await execShell(`eslint ${fixed} --ext .js,.ts,.vue --ignore-path .gitignore .`))() +(async () => await execShell([ + lintCode, + lintMd +]))()