mirror of
https://github.com/142vip/408CSFamily.git
synced 2026-04-13 18:00:58 +08:00
chore: update
This commit is contained in:
6
.github/workflows/CD.yaml
vendored
6
.github/workflows/CD.yaml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
## 部署到Github-Pages
|
||||
deploy-github:
|
||||
name: "部署到Github-Pages"
|
||||
runs-on: macos-latest
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
## 部署到vercel平台
|
||||
deploy-vercel:
|
||||
name: "部署到Vercel平台"
|
||||
runs-on: macos-latest
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == '142vip/408CSFamily'
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
@@ -91,7 +91,7 @@ jobs:
|
||||
## 版本发布
|
||||
release:
|
||||
name: "Github版本发布"
|
||||
runs-on: macos-latest
|
||||
runs-on: ubuntu-latest
|
||||
## 主库master、next且执行release更新时执行
|
||||
if: github.repository == '142vip/408CSFamily' && startsWith(github.event.head_commit.message, 'chore(release):')
|
||||
|
||||
|
||||
36
.github/workflows/CI.yml
vendored
36
.github/workflows/CI.yml
vendored
@@ -17,10 +17,17 @@ on:
|
||||
schedule:
|
||||
- cron: "0 0 1 * *"
|
||||
|
||||
# 环境变量
|
||||
env:
|
||||
# 阿里云仓库信息
|
||||
REGISTRY: registry.cn-hangzhou.aliyuncs.com
|
||||
UserName: 142vip
|
||||
|
||||
|
||||
jobs:
|
||||
install-init:
|
||||
name: "依赖安装初始化"
|
||||
runs-on: macos-latest
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: read
|
||||
@@ -59,7 +66,7 @@ jobs:
|
||||
|
||||
Base-Build:
|
||||
name: "基础编译构建"
|
||||
runs-on: macos-latest
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- install-init
|
||||
steps:
|
||||
@@ -95,9 +102,7 @@ jobs:
|
||||
|
||||
Build-Docker-Image:
|
||||
name: "构建Docker镜像"
|
||||
runs-on: macos-latest
|
||||
needs:
|
||||
- install-init
|
||||
runs-on: ubuntu-latest
|
||||
## 主库且tag更新时执行
|
||||
if: github.repository == '142vip/408CSFamily' && startsWith(github.ref, 'refs/tags/v')
|
||||
permissions:
|
||||
@@ -112,6 +117,12 @@ jobs:
|
||||
# “最近更新时间” 等 git 日志相关信息,需要拉取全部提交记录
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login Docker
|
||||
run: |
|
||||
docker version
|
||||
@@ -121,23 +132,18 @@ jobs:
|
||||
--password=${{ secrets.DOCKER_PASSWORD }} \
|
||||
${{env.REGISTRY}}
|
||||
|
||||
- name: Restore Dependencies From Cache
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: node_modules
|
||||
key: ${{ runner.os }}-node_modules-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||
|
||||
## 支持思维导图转化
|
||||
- name: Build Mark-Map
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
./scripts/mark-map
|
||||
./scripts/ci
|
||||
|
||||
## 构建,支持domain
|
||||
- name: Build To Dist
|
||||
run: |
|
||||
./scripts/bundle build_proxy
|
||||
./scripts/bundle build
|
||||
|
||||
## 快速构建并推送
|
||||
- name: Push Docker Image
|
||||
run: |
|
||||
./scripts/bundle image_faster
|
||||
|
||||
|
||||
|
||||
3
.markdownignore
Normal file
3
.markdownignore
Normal file
@@ -0,0 +1,3 @@
|
||||
**/node_modules/**
|
||||
CHANGELOG.md
|
||||
LICENSE
|
||||
72
.markdownlint.js
Normal file
72
.markdownlint.js
Normal file
@@ -0,0 +1,72 @@
|
||||
// 参考:https://github.com/updownpress/markdown-lint/tree/master/rules
|
||||
module.exports = {
|
||||
"default": true,
|
||||
"MD001": false,
|
||||
"MD003": {
|
||||
"style": "atx"
|
||||
},
|
||||
"MD004": {
|
||||
"style": "dash"
|
||||
},
|
||||
"MD013": false,
|
||||
"MD024": {
|
||||
"allow_different_nesting": true
|
||||
},
|
||||
"MD025": {
|
||||
"front_matter_title": ""
|
||||
},
|
||||
"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
|
||||
}
|
||||
116
CHANGELOG.md
116
CHANGELOG.md
@@ -4,98 +4,106 @@ All notable changes to this project will be documented in this file. See [Conven
|
||||
|
||||
<!-- #region recent-alpha -->
|
||||
|
||||
## [0.0.1-alpha.6](https://github.com/mmdapl/408CSFamily/compare/v0.0.1-alpha.5...v0.0.1-alpha.6) (2023-10-15)
|
||||
## [0.0.1-alpha.7](https://github.com/142vip/408CSFamily/compare/v0.0.1-alpha.6...v0.0.1-alpha.7) (2023-10-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* 修改侧边栏内容,大幅增加md初始文档 ([#61](https://github.com/mmdapl/408CSFamily/issues/61)) ([fe3dedb](https://github.com/mmdapl/408CSFamily/commit/fe3dedbc35068a8498ea106e944f963488bfb3c5))
|
||||
* 删除栈、队列备份文件,优化数据结构文档 ([2d47327](https://github.com/mmdapl/408CSFamily/commit/2d473270cc5924d5333200f759e7ec212ee4e43f))
|
||||
* 集成xmind,支持思维导图在线预览 ([3ff248b](https://github.com/mmdapl/408CSFamily/commit/3ff248b2cdb08313dbaae70eb9665dc9e4b529c1))
|
||||
* 408各科导航目录梳理,修改跳转链 ([cd9f486](https://github.com/142vip/408CSFamily/commit/cd9f486bfb3c4f058777102f4ec95d284eafe956))
|
||||
* **markdownlint-cli:** 添加markdown文档校验,支持lint脚本自动格式化文档 ([151249b](https://github.com/142vip/408CSFamily/commit/151249bf2eda3c190b3b6c61cdcf5d4cc8c5b18c))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复release变更记录异常 ([452e9ea](https://github.com/mmdapl/408CSFamily/commit/452e9ead6d7a61d0add18235f81011cf7decdf88))
|
||||
* 修复xmind文件使用viewer依赖构建异常,配置自定义组件只客户端渲染 ([229ae8e](https://github.com/mmdapl/408CSFamily/commit/229ae8e41c8540e0b5e1297ac0d19907997f5209))
|
||||
* 修复思维导图显示链接跳转异常 ([b68ade5](https://github.com/mmdapl/408CSFamily/commit/b68ade5005e89861172c9be1b0e5a9b5a741e464))
|
||||
* **CI:** 修复流水线构建镜像异常 ([#68](https://github.com/142vip/408CSFamily/issues/68)) ([295299b](https://github.com/142vip/408CSFamily/commit/295299b4b521dc2cc692013c9d0b23d5dc3c431b))
|
||||
* **nginx:** 修改nginx配置,修复404页面出现首页问题 ([74544ee](https://github.com/142vip/408CSFamily/commit/74544ee6fe85f1c95d73b95f502050e452460b50))
|
||||
* **pnpm8:** 修复pnpm升级后,netlify无法安装依赖 ([eb9da3d](https://github.com/142vip/408CSFamily/commit/eb9da3d2425a5bba56e8b7a9a5807397e8d14107))
|
||||
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* vuepress及主题相关依赖同步最新 ([aa6a54f](https://github.com/mmdapl/408CSFamily/commit/aa6a54f5a9ec1f4c3313350275415b983c7d84ee))
|
||||
|
||||
## [0.0.1-alpha.5](https://github.com/mmdapl/408CSFamily/compare/v0.0.1-alpha.4...v0.0.1-alpha.5) (2023-10-10)
|
||||
* ci脚本新增pnpm安装,优化CI、CD流水线 ([67c38b0](https://github.com/142vip/408CSFamily/commit/67c38b0564ba7388058ca896498bc26a7fb3e35f))
|
||||
* **Dockerfile:** 支持node18.18.0 ([c3e8736](https://github.com/142vip/408CSFamily/commit/c3e87363551cd436774ebe2e08185a8126dbedb6))
|
||||
* 支持PNPM8 ([6c6fc92](https://github.com/142vip/408CSFamily/commit/6c6fc92c40d8807288d12f657febad776090b160))
|
||||
|
||||
## [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
|
||||
|
||||
* 优化流水线缓存 ([#55](https://github.com/mmdapl/408CSFamily/issues/55)) ([dadfea4](https://github.com/mmdapl/408CSFamily/commit/dadfea48ce9da2632044bb75a186cb774fcbd805))
|
||||
* 关闭博客功能,加入插件依赖,支持md文档拓展 ([9d24d49](https://github.com/mmdapl/408CSFamily/commit/9d24d49669768fe0c40f1362ef06110e6fd14f68))
|
||||
* 新增markdown转思维导图脚本,导航栏改版 ([67cee8c](https://github.com/mmdapl/408CSFamily/commit/67cee8cbc70ba030e47f2b2a4b3299e760468d49))
|
||||
* 新增操作系统、数据结构笔记文档 ([6962e3d](https://github.com/mmdapl/408CSFamily/commit/6962e3d48be173733c818cbc69302a338659d03c))
|
||||
* 更新思维导图,优化侧边栏快速预览 ([af23b81](https://github.com/mmdapl/408CSFamily/commit/af23b81246144f545e337f83cfa2bed65dfe6daf))
|
||||
* 绘制部分思维导图 ([d084c7c](https://github.com/mmdapl/408CSFamily/commit/d084c7c12d1a62bcf685cc54a23a28d3cdb4abf8))
|
||||
|
||||
- 修改侧边栏内容,大幅增加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
|
||||
|
||||
* 修复CD流水线vercel发布异常 ([384a752](https://github.com/mmdapl/408CSFamily/commit/384a7524744f4605487d3c2d4ded2e1bef6ae03d))
|
||||
|
||||
- 修复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
|
||||
|
||||
* 修改CI代码拉取策略,简化scripts脚本命令 ([#54](https://github.com/mmdapl/408CSFamily/issues/54)) ([5e1aedb](https://github.com/mmdapl/408CSFamily/commit/5e1aedbd463fcd265c8641270ae65429481fb1d1))
|
||||
|
||||
## [0.0.1-alpha.4](https://github.com/mmdapl/408CSFamily/compare/v0.0.1-alpha.3...v0.0.1-alpha.4) (2023-09-28)
|
||||
- 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
|
||||
|
||||
* 新增一些文档 ([0d947c7](https://github.com/mmdapl/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206))
|
||||
* 新增scripts脚本说明 ([32d42f7](https://github.com/mmdapl/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4))
|
||||
|
||||
- 优化流水线缓存 ([#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
|
||||
|
||||
* 修复Github Release异常 ([c3de0ba](https://github.com/mmdapl/408CSFamily/commit/c3de0bae093237e870fa8e534e69c219ddd02301))
|
||||
|
||||
|
||||
## [0.0.1-alpha.3](https://github.com/mmdapl/408CSFamily/compare/v0.0.1-alpha.2...v0.0.1-alpha.3) (2023-09-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复持续交付vercel异常 ([57473e5](https://github.com/mmdapl/408CSFamily/commit/57473e5e491a0133a2b5494c3b9e7e65b990dd23))
|
||||
|
||||
## [0.0.1-alpha.2](https://github.com/mmdapl/408CSFamily/compare/v0.0.1-alpha.1...v0.0.1-alpha.2) (2023-09-28)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复release CD异常 ([7ce3714](https://github.com/mmdapl/408CSFamily/commit/7ce3714f9bcfbcad40ef9df462a343b37742273a))
|
||||
|
||||
- 修复CD流水线vercel发布异常 ([384a752](https://github.com/142vip/408CSFamily/commit/384a7524744f4605487d3c2d4ded2e1bef6ae03d))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 升级依赖版本,支持锁定node18.18 ([a1dfbaf](https://github.com/mmdapl/408CSFamily/commit/a1dfbaf1d3c22ff5844d5c976e24b35d2578a62e))
|
||||
|
||||
## [0.0.1-alpha.1](https://github.com/mmdapl/408CSFamily/compare/v0.0.1-alpha.0...v0.0.1-alpha.1) (2023-09-08)
|
||||
- 修改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
|
||||
|
||||
* 优化脚本 ([e3d5fba](https://github.com/mmdapl/408CSFamily/commit/e3d5fbad7814d0cb652484e0eb5acbdcbe2d940b))
|
||||
* 修正脚本异常 ([c003e11](https://github.com/mmdapl/408CSFamily/commit/c003e11b8044bfdf1ff7151f04f9c03fea777095))
|
||||
* 文档更新 ([0d947c7](https://github.com/mmdapl/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206))
|
||||
* 新增release发布脚本 ([d94f30a](https://github.com/mmdapl/408CSFamily/commit/d94f30aa20063cd1c8bd9b08f63acf484fe2e698))
|
||||
* 新增scripts脚本说明 ([32d42f7](https://github.com/mmdapl/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4))
|
||||
* 新增vercel部署ci ([bc59fea](https://github.com/mmdapl/408CSFamily/commit/bc59fea739b0e20497ac86daf06a2bdbb11f8cf5))
|
||||
* 脚本优化更新 ([c072b3d](https://github.com/mmdapl/408CSFamily/commit/c072b3d3a4ae70d542a59b52babb1d67b4102230))
|
||||
|
||||
- 新增一些文档 ([0d947c7](https://github.com/142vip/408CSFamily/commit/0d947c74c20dbdf170cc49f0281ff4b196b6b206))
|
||||
- 新增scripts脚本说明 ([32d42f7](https://github.com/142vip/408CSFamily/commit/32d42f77bb5103760794994c0481d7d9b632d1d4))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复CI/CD流水线异常 ([edf222f](https://github.com/mmdapl/408CSFamily/commit/edf222f297dbe57782f46fd6d38dd7c92d59e3fe))
|
||||
- 修复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))
|
||||
|
||||
## [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))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
- 升级依赖版本,支持锁定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))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- 修复CI/CD流水线异常 ([edf222f](https://github.com/142vip/408CSFamily/commit/edf222f297dbe57782f46fd6d38dd7c92d59e3fe))
|
||||
|
||||
<!-- #endregion recent-alpha -->
|
||||
@@ -12,11 +12,11 @@ ARG CONTAINER_BUILD
|
||||
WORKDIR /apps
|
||||
COPY . .
|
||||
|
||||
RUN echo $CONTAINER_BUILD
|
||||
RUN echo $CONTAINER_BUILD;
|
||||
|
||||
## 基于容器自动构建
|
||||
RUN if [ "$CONTAINER_BUILD" = "true" ]; then \
|
||||
npm i pnpm@7 -g && pnpm i -D && ./scripts/bundle build; \
|
||||
sh ./scripts/ci && pnpm build; \
|
||||
fi;
|
||||
|
||||
FROM registry.cn-hangzhou.aliyuncs.com/142vip/nginx:1.23.0-alpine
|
||||
|
||||
123
README.md
123
README.md
@@ -6,48 +6,38 @@
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div align="center">
|
||||
<div id="">
|
||||
<a href="https://github.com/mmdapl" target="_blank">
|
||||
<img alt="作者: 储凡" src="https://img.shields.io/badge/Author-Chu·Fan-8A2BE2.svg?style=for-the-badge" style="text-align: center;">
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://app.netlify.com/sites/408-family/deploys" target="_blank" style="padding: 5px">
|
||||
<img alt="Netlify" src="https://api.netlify.com/api/v1/badges/75a7251a-f873-4aff-b387-6449ca241ef7/deploy-status">
|
||||
</a>
|
||||
<a href="" target="_blank" style="padding: 5px">
|
||||
<img alt="Vercel" src="https://therealsujitk-vercel-badge.vercel.app/?app=408">
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<img alt="code size" src="https://img.shields.io/github/languages/code-size/142vip/408CSFamily" style="padding: 5px">
|
||||
<img alt="tag version" src="https://img.shields.io/github/v/tag/142vip/408CSFamily" style="padding: 5px">
|
||||
<img alt="release version" src="https://img.shields.io/github/v/release/142vip/408CSFamily" style="padding: 5px">
|
||||
<img alt="repo size" src="https://img.shields.io/github/repo-size/142vip/408CSFamily" style="padding: 5px">
|
||||
</div>
|
||||
<div id="">
|
||||
<a href="https://github.com/mmdapl" target="_blank">
|
||||
<img alt="作者: 储凡" src="https://img.shields.io/badge/Author-Chu·Fan-8A2BE2.svg?style=for-the-badge" style="text-align: center;">
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://app.netlify.com/sites/408-family/deploys" target="_blank" style="padding: 5px">
|
||||
<img alt="Netlify" src="https://api.netlify.com/api/v1/badges/75a7251a-f873-4aff-b387-6449ca241ef7/deploy-status">
|
||||
</a>
|
||||
<a href="" target="_blank" style="padding: 5px">
|
||||
<img alt="Vercel" src="https://therealsujitk-vercel-badge.vercel.app/?app=408">
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<img alt="code size" src="https://img.shields.io/github/languages/code-size/142vip/408CSFamily" style="padding: 5px">
|
||||
<img alt="tag version" src="https://img.shields.io/github/v/tag/142vip/408CSFamily" style="padding: 5px">
|
||||
<img alt="release version" src="https://img.shields.io/github/v/release/142vip/408CSFamily" style="padding: 5px">
|
||||
<img alt="repo size" src="https://img.shields.io/github/repo-size/142vip/408CSFamily" style="padding: 5px">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 在线浏览
|
||||
|
||||
- 稳定版: <https://408.142vip.cn>
|
||||
|
||||
|
||||
> 网站无法访问时,建议通过科学上网访问备用网络
|
||||
|
||||
- Github: <https://142vip.github.io/408CSFamily>
|
||||
- Netlify: <https://408-family.netlify.app>
|
||||
- Vercel: <https://408-family.vercel.app>
|
||||
|
||||
|
||||
|
||||
## 写最前面
|
||||
|
||||
`408CSFamily` 我的理解是:408计算机专业课”全家桶“,而408相信考研er都知道计算机考研专业课代码;在最新的高校计算机研究生招考中,已经越来越多的学校改考408。可见408所涉及到的专业课举足轻重的地位;不论是在考研或者找工作,我相信408的专业基础必定是难以避免的,所以话不多说、形势复杂,唯一能做的就是不停的学习、巩固基础知识,加油!
|
||||
@@ -59,10 +49,6 @@
|
||||
1. 长期更新、维护
|
||||
2. 建议结合思维导图进行学习
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 思维导图【MD文档版本】
|
||||
|
||||
> 主要是关键知识,更新优化中...
|
||||
@@ -72,39 +58,29 @@
|
||||
- 操作系统(TBD)
|
||||
- 计算机网络(TBD)
|
||||
|
||||
|
||||
## 电子书PDF
|
||||
|
||||
### 王道
|
||||
|
||||
- 数据结构2019: <https://pan.baidu.com/s/18x8AIfOkZxz197eY7HLRMg> 密码: 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: <https://pan.baidu.com/s/1DiOBJMt9ZnZ6GK4CRCETJg> 密码: wic5
|
||||
|
||||
- 计算机网络2019: <https://pan.baidu.com/s/1mmIZDugwY5YyytzIJoGQFw> 密码: dpkb
|
||||
|
||||
- 操作系统2019: <https://pan.baidu.com/s/1gzuUqq09xqi8wQ8JJRF69g> 密码: 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协议
|
||||
|
||||
|
||||
|
||||
|
||||
## 赞赏列表
|
||||
|
||||
以下排名不分先后! [传送门→]() **赞赏过的一定要微信跟我说呀!!!!!!**
|
||||
|
||||
|
||||
<div>
|
||||
<a href="https://github.com/ChiefPing" target="_blank" style="margin: 5px">
|
||||
<img alt="ChiefPing" src="https://avatars2.githubusercontent.com/u/34122068?s=460&v=4" width="50px" style="brder-radius:5px;"/>
|
||||
</a>
|
||||
</a>
|
||||
<a href="https://github.com/xiaoliuxin" target="_blank" style="margin: 5px">
|
||||
<img alt="xiaoliuxin" src="https://avatars2.githubusercontent.com/u/60652527?s=460&v=4" style="border-radius:5px;" width="50px"/>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
## 赞助商
|
||||
|
||||
**以下排名不分先后! 还木有收到赞助,哈哈哈,先留坑**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 贡献
|
||||
|
||||
感谢向仓库提交mr的所有开发者
|
||||
@@ -354,7 +309,6 @@
|
||||
<img alt="Star History" src="https://api.star-history.com/svg?repos=142vip/408CSFamily&type=Date" >
|
||||
</div>
|
||||
|
||||
|
||||
## 联系作者
|
||||
|
||||
若系列文章对你有所帮助,欢迎订阅公众号或微信”骚扰“,获取更多内容。**商务合作请备注来意**
|
||||
@@ -362,13 +316,13 @@
|
||||
<div style="text-align: center">
|
||||
<div align="center" >
|
||||
<table style="border:none;cell-padding:0; cell-spacing:0;border-collapse:collapse;" border="0">
|
||||
<img src="https://cdn.statically.io/gh/142vip/cdn_service@main/media/fairy-sister-450x450.jpg"
|
||||
<img src="https://cdn.statically.io/gh/142vip/cdn_service@main/media/fairy-sister-450x450.jpg"
|
||||
width="250px"
|
||||
style="margin:10px"
|
||||
style="margin:10px"
|
||||
title="欢迎关注公众号:Rong姐姐好可爱" alt="关注公众号"/>
|
||||
<img src="https://cdn.statically.io/gh/142vip/cdn_service@main/media/chu-fan-443-650x650.jpg"
|
||||
width="250px"
|
||||
style="margin:10px"
|
||||
style="margin:10px"
|
||||
title="欢迎添加微信:chufan443 " alt="联系作者"/>
|
||||
</table>
|
||||
</div>
|
||||
@@ -424,8 +378,3 @@
|
||||
|
||||
交流/加群/互看朋友圈
|
||||
当然:**聊天 /提问 /建议 /提需求** 可以在本公众号直接**私信**,后台可以看到,有时间即会回复,偶尔的延迟和疏漏还请小伙伴们谅解,蟹蟹。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
# 大事记
|
||||
|
||||
|
||||
> 有时间再梳理梳理吧....
|
||||
|
||||
|
||||
### 2020.6.22
|
||||
### 2020.6.22
|
||||
|
||||
- 第一次Github提交,开源
|
||||
|
||||
### 2020.4.8
|
||||
|
||||
- 武汉疫情解封
|
||||
- 项目成立,取名`408CSFamily`
|
||||
- 武汉疫情解封
|
||||
- 项目成立,取名`408CSFamily`
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
该文件包含 `408CSFamily` 仓库和网站所有显着更改。
|
||||
|
||||
|
||||
<!-- @include: ../CHANGELOG.md#recent-alpha -->
|
||||
|
||||
## 更多
|
||||
@@ -12,4 +11,3 @@
|
||||
对于发布早于 0.0.1-alpha.1 的历史版本,详见[Github 仓库](https://github.com/142vip/408CSFamily/blob/master/CHANGELOG.md) 。
|
||||
|
||||
:::
|
||||
|
||||
|
||||
@@ -20,20 +20,21 @@
|
||||
|
||||
```
|
||||
|
||||
|
||||
**帮朋友转发、宣传一下,JD是相对社招而言,校招、实习会降低要求!社招、校招、实习机会多多,更有漂亮hr小姐姐引导整个流程;
|
||||
不论是在校学生还是已步入职场的你,只要有兴趣,觉得合适的给我简历安排内推;欢迎简历骚扰,备注来意即可:mmdapl@163.com**
|
||||
|
||||
不论是在校学生还是已步入职场的你,只要有兴趣,觉得合适的给我简历安排内推;欢迎简历骚扰,备注来意即可:<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等;
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# 计算机组成原理
|
||||
|
||||
|
||||
|
||||
### 引论
|
||||
|
||||
### 数据的表示和运算
|
||||
@@ -15,4 +13,3 @@
|
||||
### 总线
|
||||
|
||||
### 输入/输出系统
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@ root(计算机网络)
|
||||
- 基本介绍
|
||||
- 体系结构与参考模型
|
||||
|
||||
|
||||
## 物理层
|
||||
|
||||
- 通信基础
|
||||
@@ -50,7 +49,6 @@ root(计算机网络)
|
||||
- UDP协议
|
||||
- TCP协议
|
||||
|
||||
|
||||
## 应用层
|
||||
|
||||
- 应用模型
|
||||
@@ -62,4 +60,4 @@ root(计算机网络)
|
||||
## 参考资料
|
||||
|
||||
-《计算机网络-第七版》谢希仁著.
|
||||
-《计算机网络-王道考研》2019 王道论坛.
|
||||
-《计算机网络-王道考研》2019 王道论坛.
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 提供的服务
|
||||
# 提供的服务
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# UDP协议
|
||||
# UDP协议
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# TCP协议
|
||||
# TCP协议
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本介绍
|
||||
# 基本介绍
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 体系结构与参考模型
|
||||
# 体系结构与参考模型
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 应用模型
|
||||
# 应用模型
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# DNS
|
||||
# DNS
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# FTP
|
||||
# FTP
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# HTTP
|
||||
# HTTP
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 电子邮件
|
||||
# 电子邮件
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本功能
|
||||
# 基本功能
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 组帧
|
||||
# 组帧
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 差错控制
|
||||
# 差错控制
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 流量控制&可靠传输
|
||||
# 流量控制&可靠传输
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 介质访问控制
|
||||
# 介质访问控制
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 局域网
|
||||
# 局域网
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 广域网
|
||||
# 广域网
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 通信设备
|
||||
# 通信设备
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 通信基础
|
||||
# 通信基础
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 传输介质
|
||||
# 传输介质
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 物理层设备
|
||||
# 物理层设备
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本功能
|
||||
# 基本功能
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 路由算法
|
||||
# 路由算法
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 路由协议
|
||||
# 路由协议
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# IPV4
|
||||
# IPV4
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# IPV6
|
||||
# IPV6
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# IP组播&移动IP
|
||||
# IP组播&移动IP
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 网络层设备
|
||||
# 网络层设备
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 一些总结
|
||||
# 一些总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -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 王道论坛.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本概念
|
||||
# 基本概念
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 简单的模式匹配
|
||||
# 简单的模式匹配
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# KMP算法
|
||||
# KMP算法
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# 基本概念
|
||||
# 基本概念
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 图的存储
|
||||
# 图的存储
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 图的遍历
|
||||
# 图的遍历
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 图的应用
|
||||
# 图的应用
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -26,16 +26,12 @@ root(基础概念)
|
||||
|
||||
**数据的基本单位**,通常按照一个整数来进行考虑和处理。
|
||||
|
||||
|
||||
特别注意:一个数据元素由若干个**数据项**组成,数据项是构成数组元素的最小单位,且不可分割。
|
||||
|
||||
|
||||
|
||||
### 数据对象
|
||||
|
||||
具有**相同性质**的数据元素的**集合**,**是数据的子集**
|
||||
|
||||
|
||||
### 数据类型
|
||||
|
||||
值的集合和定义在此集合上一组操作的总称
|
||||
@@ -44,8 +40,6 @@ root(基础概念)
|
||||
- 结构类型:可以分解成若干分量(成分)的数据类型;
|
||||
- **抽象数据类型**:抽象出具组织和其相关的操作;
|
||||
|
||||
|
||||
|
||||
### 抽象数据类型(ADT)
|
||||
|
||||
> Tips: 可以结合高级语言中类对象封装来理解;
|
||||
@@ -58,23 +52,18 @@ ADT抽象数据类型名{
|
||||
} ADT抽象数据类型名
|
||||
```
|
||||
|
||||
|
||||
|
||||
一个数学模型以及定义在该模型上的一组操作。定义仅仅取决于它的一组逻辑操作。与计算机内部如何表示和实现是没有关系;
|
||||
|
||||
**不论内部结构如何变化,只要其数学特性不变,就不会影响到外部的使用,实现了数据封装和信息隐藏**
|
||||
|
||||
|
||||
通常由(数据对象、数据关系、数据操作集)三元组来表示抽象数据类型;
|
||||
|
||||
抽象数据类型的主要作用是**数据封装和信息隐藏,让实现与使用相分离**。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节,从而使这些操作不会受到其他对象的影响。
|
||||
|
||||
抽象数据类型独立于运算的具体实现,使用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,实现了信息隐藏。
|
||||
|
||||
|
||||
### 数据结构
|
||||
|
||||
|
||||
首先明确:数据元素都不是孤立存在的。元素与元素之间存在着某种关系,这种相互之间的关系就是**结构**。
|
||||
|
||||
**数据结构是相互之间存在一种或者多种特定关系的数据元素的集合**
|
||||
@@ -86,4 +75,3 @@ ADT抽象数据类型名{
|
||||
数据的逻辑结构和存储结构是密不可分的。
|
||||
|
||||
**算法的设计取决于所选定的逻辑结构;算法的实现依赖于所采用的存储结构;**
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ head:
|
||||
|
||||
# 数据结构三要素
|
||||
|
||||
|
||||
```mindmap
|
||||
root(数据结构三要素)
|
||||
逻辑结构
|
||||
@@ -31,12 +30,10 @@ root(数据结构三要素)
|
||||
- 线性结构
|
||||
- 非线性结构
|
||||
|
||||
|
||||
线性表是典型的线性结构,衍生出的栈、队列、串、数组、广义表也都是线性结构;
|
||||
|
||||
非线性结构主要有:集合、树(一般树、二叉树)、图(有向图、无向图)
|
||||
|
||||
|
||||
特别注意:
|
||||
|
||||
- `集合`:结构中的数据元素之间**除了“同属于一个集合”的关系外,别无其他关系。**
|
||||
@@ -44,15 +41,12 @@ root(数据结构三要素)
|
||||
- `树形结构`:结构中的数据元素之间**存在一对多的关系。**
|
||||
- `图状结构和网状结构`:结构中的数据元素之间**存在多对多的关系。**
|
||||
|
||||
|
||||
|
||||
### 存储(物理)结构
|
||||
|
||||
数据结构在计算机中的表示(映像)。包括数据`元素的表示`和`关系的表示`。
|
||||
|
||||
存储结构是逻辑结构用计算机语言实现的,依赖于计算机语言。
|
||||
|
||||
|
||||
可以分为:
|
||||
|
||||
- 顺序存储
|
||||
@@ -78,19 +72,17 @@ root(数据结构三要素)
|
||||
|
||||
什么是内外部碎片?
|
||||
|
||||
> 参考资料:https://blog.csdn.net/qq_22238021/article/details/80209062
|
||||
> 参考资料:<https://blog.csdn.net/qq_22238021/article/details/80209062>
|
||||
|
||||
- 外部碎片:`还没有分配出去`(不属于任何进程),但是**由于大小而无法分配给申请内存空间的新进程的内存空闲块。**
|
||||
- 内部碎片:`已经被分配出去`(能明确指出属于哪个进程)的**内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。**
|
||||
|
||||
|
||||
#### 链式存储
|
||||
|
||||
与顺序存储不同,**链式存储不要求逻辑上相邻的元素在物理位置上也相邻。**
|
||||
|
||||
借助指示元素存储地址的`指针`表示元素之间的逻辑关系。
|
||||
|
||||
|
||||
优点:
|
||||
|
||||
- 不会出现碎片现象
|
||||
@@ -101,7 +93,6 @@ root(数据结构三要素)
|
||||
- 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习)。
|
||||
- 链式存储,**只能实现`顺序存取`,不能实现`随机存取`(指针的遍历)**
|
||||
|
||||
|
||||
#### 索引存储
|
||||
|
||||
存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的`索引表`。
|
||||
@@ -112,7 +103,6 @@ root(数据结构三要素)
|
||||
|
||||
- 检索快(就好比字典有了目录,查询就很快了)
|
||||
|
||||
|
||||
缺点:
|
||||
|
||||
- 增加了索引表,占用较多的存储空间(典型的空间换时间策略)
|
||||
@@ -122,11 +112,9 @@ root(数据结构三要素)
|
||||
|
||||
根据元素的关键字直接通过散列(Hash)函数计算出元素的存储地址。
|
||||
|
||||
|
||||
优点:
|
||||
|
||||
- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了)
|
||||
|
||||
- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了)
|
||||
|
||||
缺点:
|
||||
|
||||
@@ -134,7 +122,6 @@ root(数据结构三要素)
|
||||
- 会出现`散列冲突`(主要依赖与散列函数,散列函数不好就很容易出现散列冲突)
|
||||
- 出现`散列冲突`时,解决冲突就会增加时间和空间上的开销
|
||||
|
||||
|
||||
### 数据的运算
|
||||
|
||||
数据上的运算包括:`运算的定义` 、`运算的实现`
|
||||
@@ -142,7 +129,4 @@ root(数据结构三要素)
|
||||
- `运算的定义`:针对逻辑结构,指出运算的功能
|
||||
- `原酸的实现`:针对存储结构,指出运算的具体操作步骤
|
||||
|
||||
|
||||
|
||||
|
||||
线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。
|
||||
线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。
|
||||
|
||||
@@ -22,12 +22,10 @@ root(算法和算法评价)
|
||||
空间复杂度
|
||||
```
|
||||
|
||||
|
||||
### 算法
|
||||
|
||||
`算法` : 对特定问题求解步骤的一种描述,**是指令的有序集合**,每一条指令表示一个或多个操作。
|
||||
|
||||
|
||||
#### 重要特性
|
||||
|
||||
- `有穷性`:必须总是(对任何合法的输入值)在**执行有穷步后结束**,并且每一步都可**在有穷时间内完成**
|
||||
@@ -36,7 +34,6 @@ root(算法和算法评价)
|
||||
- `输入`:有零个或者多个输入,**输入取决于某个特定的对象的集合。**
|
||||
- `输出`:有一个或者多个输出,**输出是和输入有着某种特定关系的量(强调输出与输入的关系)**
|
||||
|
||||
|
||||
> **算法是有穷的,但是程序不一定满足有穷性**,程序只是算法在计算机上的特定的实现, 例如:死循环
|
||||
|
||||
#### 算法的目标
|
||||
@@ -48,10 +45,8 @@ root(算法和算法评价)
|
||||
- 健壮性:**在输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果**(在高级语言编程中,类似于强调封装方法的参数校验)
|
||||
- 效率与低存储量需求:**效率即算法执行的时间**,**存储量需求即算法那执行过程中所有要的最大存储空间**,这些与算法所解决问题的规模有关;
|
||||
|
||||
|
||||
> Tips: 效率可以结合时间复杂度来理解,存储量需求可以结合空间复杂度理解;
|
||||
|
||||
|
||||
### 效率的度量
|
||||
|
||||
算法效率的度量是通过`时间复杂度`和`空间复杂度`来描述的;
|
||||
@@ -79,6 +74,7 @@ int test(n) {
|
||||
|
||||
|
||||
```
|
||||
|
||||
在这个简单的函数里
|
||||
|
||||
- 当n<1的时候,例如:-2,就不需要循环,此时时间复杂度可以理解为T(1)
|
||||
@@ -88,13 +84,10 @@ int test(n) {
|
||||
|
||||
> **算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入的数据的性质(例如:输入元素的初始状态)**
|
||||
|
||||
|
||||
|
||||
- `最坏时间复杂度`:**最坏情况下**,算法的时间复杂度
|
||||
- `平均时间复杂度`:**所有可能输入实例在同等概率出现的情况下**,算法的期望运行时间
|
||||
- `最好时间复杂度`:**最好的情况下**,算法的时间复杂度
|
||||
|
||||
|
||||
一般情况下,考虑最坏情况的时间复杂度(即:最坏时间复杂度),保证算法的运行时间不会更长(最糟糕我都能预料,难道还有更糟糕?????噗呲)
|
||||
|
||||
#### 空间复杂度
|
||||
@@ -103,13 +96,10 @@ int test(n) {
|
||||
|
||||
> 渐进空间复杂度也被称为空间复杂度,记作:S(n)=O(g(n))
|
||||
|
||||
|
||||
**一个程序除了需要存储空间来存放本身所用的指令、常数、变量和输入数据外,也需要对数据进行操作的工作单元和存储一些实现计算所需要信息的辅助空间。**
|
||||
|
||||
当输入数据所占用的空间只取决于问题本身,和算法无关时,只需要去分析除了输入和程序之外的额外空间
|
||||
|
||||
|
||||
|
||||
算法原地工作:算法所需要辅助空间是常量,记作S(1),例如:
|
||||
|
||||
```c
|
||||
@@ -121,4 +111,4 @@ int switchValue(a,b){
|
||||
}
|
||||
```
|
||||
|
||||
在上面的函数中,只是通过临时变量temp来实现a和b的值交换,没有需要更多变量,因此可以简单理解函数的在`原地工作`,辅助空间是常量,记作S(1)
|
||||
在上面的函数中,只是通过临时变量temp来实现a和b的值交换,没有需要更多变量,因此可以简单理解函数的在`原地工作`,辅助空间是常量,记作S(1)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# 基础入门
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本概念
|
||||
# 基本概念
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 插入排序
|
||||
# 插入排序
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 交换排序
|
||||
# 交换排序
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 选择排序
|
||||
# 选择排序
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 归并排序
|
||||
# 归并排序
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基数排序
|
||||
# 基数排序
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 外部排序
|
||||
# 外部排序
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本概念
|
||||
# 基本概念
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 顺序查找
|
||||
# 顺序查找
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 折半查找
|
||||
# 折半查找
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# B树和B+树
|
||||
# B树和B+树
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 散列表
|
||||
# 散列表
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 总结
|
||||
# 总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -12,7 +12,6 @@ head:
|
||||
|
||||
`栈`: 只允许在一端进行插入或者删除操作的**线性表**,`后进先出的线性表`。
|
||||
|
||||
|
||||
- 明确栈是一种线性表
|
||||
- 限定栈只能在某一端进行插入或者删除操作
|
||||
|
||||
@@ -24,31 +23,22 @@ head:
|
||||
|
||||
`空栈`:不含任何元素的空表,也叫**栈空**
|
||||
|
||||
|
||||
|
||||
基本结构如下:
|
||||
|
||||
|
||||
|
||||
|
||||
在上面的基本结构中,可以假设存在栈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`进栈操作,插入到栈内成为`新的栈顶元素`。
|
||||
@@ -56,6 +46,4 @@ head:
|
||||
- `GetTop(S,&x)`: 读栈顶元素,若栈`S`非空,用x返回栈顶元素。
|
||||
- `ClearStack(&S)`: 销毁栈,释放栈`S`占用的存储空间。
|
||||
|
||||
|
||||
|
||||
> Tips: `&`是C++特有的,可以用来表示引用调用,类似`传址目的`,可以类比指针。 当然,在C语言中*代表指针,指向存储地址,也是具有`传址目的`
|
||||
> Tips: `&`是C++特有的,可以用来表示引用调用,类似`传址目的`,可以类比指针。 当然,在C语言中*代表指针,指向存储地址,也是具有`传址目的`
|
||||
|
||||
@@ -8,12 +8,10 @@ head:
|
||||
|
||||
# 栈的顺序存储结构
|
||||
|
||||
|
||||
`顺序栈`:栈的顺序存储,利用一组地址连续的存储单元存放自栈底到栈顶的所有元素,同时**附加一个用来指向当前栈顶位置的指针**
|
||||
|
||||
> 指针指向栈顶(top)主要是因为栈在线性表的一端操作,操作的那端就是栈顶,方便操作。
|
||||
|
||||
|
||||
## 顺序栈的存储类型
|
||||
|
||||
```cpp
|
||||
@@ -38,20 +36,14 @@ typedef struct{
|
||||
- 栈满条件:S.top=MaxSize-1
|
||||
- 栈长:S.top+1
|
||||
|
||||
|
||||
> Tips: 进栈先移动指针,避免占满,元素无法添加,出现外溢;出栈先取栈顶元素,保证指针永远指向栈顶。
|
||||
|
||||
|
||||
|
||||
顺序栈的存储结构体定义可以很明显看出,顺序栈的入栈操作会受到数组上界(MaxSize)的约束。
|
||||
|
||||
**当对栈的最大使用空间估计不足时,容易出现栈上溢(外溢),需要主动向用户报告反馈,避免出现错误;**
|
||||
|
||||
|
||||
|
||||
## 顺序栈的基本运算
|
||||
|
||||
|
||||
- `InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1
|
||||
- `StackEmpty(S)`: 判断一个栈是否为空,如果栈空则返回`true`,否则返回`false`
|
||||
- `Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。
|
||||
@@ -59,10 +51,8 @@ typedef struct{
|
||||
- `GetTop(S,&x)`: 读栈顶元素,若栈`S`非空,用x返回栈顶元素。
|
||||
- `ClearStack(&S)`: 销毁栈,释放栈`S`占用的存储空间。
|
||||
|
||||
|
||||
### 初始化
|
||||
|
||||
|
||||
`InitStack(&S)`: 初始化一个空栈`S`,栈顶指针初始化为-1
|
||||
|
||||
```cpp
|
||||
@@ -74,7 +64,6 @@ void InitStack(&S){
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 栈空判断
|
||||
|
||||
`StackEmpty(S)`: 判断一个栈是否为空,即:栈顶指针是否为-1,如果栈空则返回`true`,否则返回`false`
|
||||
@@ -93,10 +82,8 @@ bool StackEmpty(S){
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 进栈
|
||||
|
||||
|
||||
`Push(&S,x)`: 进栈,若栈未满,`x`进栈操作,插入到栈内成为`新的栈顶元素`。
|
||||
|
||||
```cpp
|
||||
@@ -115,6 +102,7 @@ bool Push(SqStack &S,ElemType x){
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
注意:
|
||||
|
||||
- 进栈先移动栈顶指针+1,再操作入栈元素
|
||||
@@ -146,8 +134,6 @@ bool Pop(SqStack &S,ElemType &x){
|
||||
- 出栈操作,先让元素出栈,获取栈顶元素,再移动指针-1
|
||||
- `i--`是先使用变量i,再对变量做递减操作,即:先用后加(减)
|
||||
|
||||
|
||||
|
||||
### 读(获取)栈顶元素
|
||||
|
||||
`GetTop(S,&x)`: 读栈顶元素,若栈`S`非空,用x返回栈顶元素。
|
||||
@@ -171,8 +157,6 @@ bool GetTop(SqStack S,ElemType &x){
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
**上面的这些操作都是基于栈顶指针初始化为`-1`的情况**
|
||||
|
||||
当栈顶指针初始化为`S.top=0`,相关操作操作会有区别:
|
||||
@@ -180,21 +164,16 @@ bool GetTop(SqStack S,ElemType &x){
|
||||
- 入栈: `S.data[S.top++]=x`
|
||||
- 出栈: `x=S.data[--S.top]`
|
||||
|
||||
|
||||
**同时, 栈空、栈满条件也会有变化,要仔细对比揣摩**
|
||||
|
||||
|
||||
|
||||
## 共享栈
|
||||
|
||||
|
||||
`共享栈`:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个`一维存储空间`,将两个栈的栈底分别设置在共享空间的两端,两个栈顶则向共享空间的中间延伸
|
||||
|
||||
>Tips: 类似头对头,一致对外这种感觉,噗呲哈哈
|
||||
|
||||

|
||||
|
||||
|
||||
在上面的共享栈结构图中,两个栈(0、1号顺序栈)的栈顶指针都指向栈顶元素
|
||||
|
||||
- 0号栈栈顶指针`top=-1`时,0号栈为空
|
||||
@@ -202,13 +181,10 @@ bool GetTop(SqStack S,ElemType &x){
|
||||
|
||||
当且仅当两个栈的栈顶指针相邻(`top1-top0=1`),可以判断共享栈栈满
|
||||
|
||||
|
||||
### 进栈
|
||||
|
||||
|
||||
> 进栈:先移动指针,后进行赋值
|
||||
|
||||
|
||||
- 当0号栈进栈时,0号栈栈顶指针top0`先加1后赋值`
|
||||
- 当1号栈进栈时,0号栈栈顶指针top1`先减1后赋值`
|
||||
|
||||
@@ -216,13 +192,9 @@ bool GetTop(SqStack S,ElemType &x){
|
||||
|
||||
> 出栈:先进行赋值,后移动指针
|
||||
|
||||
|
||||
- 当0号栈进栈时,0号栈栈顶指针top0`先赋值后减1`
|
||||
- 当1号栈进栈时,0号栈栈顶指针top1`先赋值后加1`
|
||||
|
||||
|
||||
|
||||
共享栈能够更有效的利用存储空间,两个栈空间进行相互调节。只有当这个存储空间(即:共享空间)被占满时才会发生上溢。存取数据的时间复杂度都为O(1),在栈顶操作。
|
||||
|
||||
|
||||
**共享栈对存取效率没有什么影响**
|
||||
**共享栈对存取效率没有什么影响**
|
||||
|
||||
@@ -14,15 +14,12 @@ head:
|
||||
|
||||
`栈空`:对于空栈来说,链表原来的定义是头指针指向空,那么链栈的空其实就是`top=NULL`,链栈元素总数为0
|
||||
|
||||
|
||||
栈只是栈顶在做插入和删除操作,栈顶应该放在单链表的头部,所以单链表中的头结点也就失去了意义。
|
||||
|
||||
**通常对于链栈来说,是不需要头结点的,当然也存在带头结点的链栈**
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
栈的链式存储类型:
|
||||
|
||||
```cpp
|
||||
@@ -37,15 +34,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;
|
||||
|
||||
```
|
||||
@@ -56,13 +53,11 @@ typedef struct LinkStack
|
||||
- 不存在栈满上溢的情况,避免程序因溢出导致出错
|
||||
- 有效的提高存取效率
|
||||
|
||||
|
||||
## 进栈
|
||||
|
||||
- 如果链栈不存在,则栈满,入栈操作失败,返回false;
|
||||
- 如果链栈存在,进行单链表的结点插入操作,移动指针,结点元素赋值,再将结点压入链栈中,移动链栈栈顶指针,最后链栈元素总数+1,返回true
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
@@ -78,7 +73,7 @@ bool linkStackPushNode(LinkStack* linkStack,int e){
|
||||
// 判断链栈是否存在
|
||||
if (!linkStack){
|
||||
//链栈不存在,无法进栈操作,返回false
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
// 开辟栈结点元素内存控件
|
||||
StackNode* node = (StackNode*)malloc(sizeof(StackNode));
|
||||
@@ -100,7 +95,6 @@ bool linkStackPushNode(LinkStack* linkStack,int e){
|
||||
- 如果链栈不存在,或者为空栈,则无法进行出栈操作,返回false
|
||||
- 如果链栈满足出栈条件,则通过栈顶指针获取到链栈栈底结点,将其数据域赋值给变量e,移动栈顶指针指向待出栈元素的后继结点,同时释放待出栈元素的内存空间,链栈元素总数-1 ,出栈成功,返回true.
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
@@ -115,7 +109,7 @@ bool linkStackPopNode(LinkStack* linkStack,int *e){
|
||||
// 判断链栈是否存在及是否为空
|
||||
if (!linkStack || linkStack->count==0){
|
||||
//出栈失败,返回false
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
// 获取栈顶元素结点
|
||||
StackNode* node = stack->top;
|
||||
@@ -134,5 +128,4 @@ bool linkStackPopNode(LinkStack* linkStack,int *e){
|
||||
|
||||
```
|
||||
|
||||
|
||||
以上是基于单链表的链栈入栈、出栈操作,很明显**时间复杂度都为O(1)**,重点`注意移动指针,保持不断链`
|
||||
以上是基于单链表的链栈入栈、出栈操作,很明显**时间复杂度都为O(1)**,重点`注意移动指针,保持不断链`
|
||||
|
||||
@@ -8,7 +8,6 @@ head:
|
||||
|
||||
# 队列的基本概念和操作
|
||||
|
||||
|
||||
## 基本概念
|
||||
|
||||
`队列`:和栈一样,是一种操作受限制的线性表,只允许在表的一端进行插入,在表的另外一端进行删除,简称为`队`,常记作:`Queue`
|
||||
@@ -17,32 +16,25 @@ head:
|
||||
|
||||
`出队`: 删除队列元素,也叫做`离队`
|
||||
|
||||
|
||||

|
||||
|
||||
结合生活中排队的经验,在群体素质高、无人插队的情况下(`薛定谔排队`,噗呲,哈哈哈),**一般最早排队的也是最早离队的**,和栈的`后进先出`不一样的是,队列是`先进先出`的,即:First In Frist Out
|
||||
|
||||
> Tips
|
||||
>
|
||||
> - 栈:又叫做后进先出的线性表
|
||||
> - 队列:又叫做先进先出的线性表
|
||||
|
||||
|
||||
|
||||
`队头`:允许进行删除操作的一端,也叫做`队首`,常记作:`Front`
|
||||
|
||||
`队尾`:允许进行插入操作的一端,常记作:`Rear`
|
||||
|
||||
`空队列`:不含任何元素的空表,注意这个表是指`线性表`
|
||||
|
||||
|
||||
|
||||
|
||||
## 基础操作
|
||||
|
||||
|
||||
> 和栈一样,队列是操作受限的线性表,具有`先进先出`的特性,不是任何对线性表的操作都可以作为队列的操作。例如:无法随便读取到队列中间的某个数据,需要将前面的元素先出队
|
||||
|
||||
|
||||
- `InitQueue(&Q)`: 初始化一个队列,构造空队列Q
|
||||
- `QueueEmpty(Q)`: 判断队列是否为空,队空返回true,否则返回false
|
||||
- `EnEmpty(&Q,x)`: 入队,如果队列Q未满,将x入队,成为新的队尾元素
|
||||
|
||||
@@ -8,8 +8,8 @@ head:
|
||||
|
||||
# 队列的顺序存储结构
|
||||
|
||||
|
||||
> 队列的顺序实现是指分配一块连续的存储单元用来存放队列中的元素,并且附加两个指针。
|
||||
>
|
||||
> - `front指针`: 指向队头元素的位置
|
||||
> - `rear指针`: 指向队尾元素的位置
|
||||
|
||||
@@ -28,7 +28,6 @@ typedef struct {
|
||||
} SqQueue;
|
||||
```
|
||||
|
||||
|
||||
假定:
|
||||
|
||||
- 队头指针指向队头元素
|
||||
@@ -40,8 +39,6 @@ typedef struct {
|
||||
- 入队操作:队不满时,先赋值给队尾元素,再移动队尾指针+1
|
||||
- 出队操作: 队不空时,先取队头元素值,再移动队头指针+1
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
在空队列中,初始状态为`Q.front===Q.rear==0`,当元素a入队时,队尾指针rear后移+1,入队成功后,`Q.front==0`、`Q.rear==1`,在队不满的情况下进队,都是`先赋值给队尾元素,再移动队尾指针rear+1`,通过上面的图宝贝可以看到,队列被元素打满的时:
|
||||
@@ -51,7 +48,6 @@ typedef struct {
|
||||
|
||||
> Tips: MaxSize为队列结构体定义中,最大存储元素个数哦~
|
||||
|
||||
|
||||

|
||||
|
||||
进队说完了,那给宝贝来说说出队吧。以上图为例,队列中`Q.rear==Maxsize`、`Q.front==0`;当出现元素在队首出队,就会直接影响队首指针,从上面的流程上看:
|
||||
@@ -60,20 +56,12 @@ typedef struct {
|
||||
|
||||
- 当队列中的元素都陆续出队,抛弃了宝贝(都是渣男,噗呲,哈哈哈),指针会是:`Q.rear==Q.front==MaxSize`
|
||||
|
||||
|
||||
|
||||
从上面两张图中,我们来思考:
|
||||
|
||||
> 前面队空条件为:`Q.front===Q.rear===0`,那能用`Q.rear==MaxSize`来表示队满嘛?
|
||||
|
||||
|
||||
傻瓜,你在瞅瞅前面的图,明显存在`Q.rear==MaxSize`,但队列确实空的情况呀。队满要灵活判断,可不要死记书上总结的。书上说的很多结论都是有前提的,老师记结论不记前提容易张冠李戴、含糊不清的呀~
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
很显然,也存在下面这种情况:
|
||||
|
||||
- 队头指针指向队头元素的前一个位置
|
||||
@@ -81,60 +69,43 @@ typedef struct {
|
||||
|
||||
此时的入队、出队过程就宝贝自己去画流程图咯
|
||||
|
||||
|
||||
|
||||
## 循环队列
|
||||
|
||||
在上面的顺序队列中,当队满后进行出队列,由于顺序队列出队只在队首进行操作,并且只会修改队首指针,这时候就会出现队尾指针一直`Q.rear===MaxSize`情况,就如下:
|
||||
|
||||
|
||||

|
||||
|
||||
可以很明显的看到,明明队列不满,但是由于进队列只能在队尾操作,因此不能进行进队操作;通常在这种情况下入队就会出现“上溢出”。
|
||||
|
||||
> 需要明确的是:上溢出并不是真正的溢出,只是表明在顺序队列中队不满却无法入队的情况,是一种假的”溢出“
|
||||
|
||||
|
||||
|
||||
|
||||
这种情况在顺序队列中是非常常见的,也是顺序队列的一大缺点。为了克服这个缺点,计算机先贤们总是能够有很多很好的办法,这里不得不佩服!!,所以就有了循环队列,**一个将顺序队列臆想为一个环状的空间**
|
||||
|
||||
|
||||
> 很多时候就是这样,为了解决一个问题,从而衍生出一个新的知识
|
||||
|
||||
|
||||
`循环队列`:把顺序队列臆想为一个环状的空间,将存储队列元素的表从逻辑上看做为一个环
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
当队首指针`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**
|
||||
|
||||
|
||||

|
||||
|
||||
如上图,循环队列从最开始初始化为空队列时:`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`来区分`队空`和`队满`是非常不合适的。
|
||||
|
||||
|
||||
|
||||
|
||||
### 如何区别队空还是队满
|
||||
|
||||
> 为了很好的区别循环队列的`队空`还是`队满`的情况,一般有三种处理方式.
|
||||
>
|
||||
#### 牺牲一个单元来区分队空和队满
|
||||
|
||||
这种方式**要求在入队时少用一个队列单元**,是一种比较普遍的做法。约定:
|
||||
@@ -145,7 +116,6 @@ typedef struct {
|
||||
- 队空条件:`Q.front==Q.rear`
|
||||
- 队列中元素个数:`(Q.rear+MaxSize-Q.front)%MaxSize`
|
||||
|
||||
|
||||
#### 类型中增设表示元素个数的数据成员
|
||||
|
||||
这种就很直接了,直接和MaxSize去比较,就可以有:
|
||||
@@ -153,7 +123,6 @@ typedef struct {
|
||||
- 队空条件: `Q.count=0`
|
||||
- 队满条件: `Q.count=MaxSize`
|
||||
|
||||
|
||||
值的注意的是:在这个前提下,不论是`队空`还是`队满`,对会存在`Q.front=Q.rear`,这个可以通过前面方案解决。
|
||||
|
||||
#### 类型中增设tag数据成员标记
|
||||
@@ -166,11 +135,12 @@ typedef struct {
|
||||
可能你会对上面的这两种情况有迷惑,说实话我第一次看的时候,也挺迷惑的,这里我按照我的理解来解释一下:
|
||||
|
||||
> 在循环队列中增加tag数据成员标记,tag的主要作用:
|
||||
>
|
||||
> - 在有元素入队的时候,设置tag=1
|
||||
> - 在有元素出队的时候,设置tag=0
|
||||
|
||||
|
||||
对应的算法实现:
|
||||
|
||||
```cpp
|
||||
// 入队算法
|
||||
// 尾插法:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%Maxsize;Q.tag=1
|
||||
@@ -202,15 +172,11 @@ int DeLoopQueue(SqQueue &Q, ElemType &x){
|
||||
}
|
||||
|
||||
```
|
||||
####
|
||||
|
||||
|
||||
## 代码实现
|
||||
|
||||
|
||||
### 初始化空队列
|
||||
|
||||
|
||||
```cpp
|
||||
/*
|
||||
* @Description: 循环队列初始化,队列为空
|
||||
@@ -249,7 +215,6 @@ bool isEmpatyLoopQueue(Q){
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 入队操作
|
||||
|
||||
```cpp
|
||||
@@ -283,7 +248,6 @@ bool EnLoopQueue(SqQueue &Q, ElemType x){
|
||||
|
||||
### 出队操作
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
@@ -318,6 +282,7 @@ bool DeLoopQueue(SqQueue &Q, ElemType &x){
|
||||
```
|
||||
|
||||
### 获取队头元素
|
||||
|
||||
```cpp
|
||||
/*
|
||||
* @Description: 获取循环队列队头元素
|
||||
@@ -340,4 +305,4 @@ bool GetLoopQueueHead(SqQueue &Q, ElemType &x){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
```
|
||||
|
||||
@@ -12,19 +12,17 @@ head:
|
||||
- 头指针指向队头结点
|
||||
- 尾指针指向队尾结点(单链表的最后一个结点)
|
||||
|
||||
|
||||
这里复习下顺序队列的定义,进行比较学习
|
||||
|
||||
> 队列的顺序实现是指分配一块连续的存储单元用来存放队列中的元素,并且附加两个指针。
|
||||
>
|
||||
> - 队头指针指向队头元素
|
||||
> - 队尾指针指向队尾元素的下一个位置
|
||||
|
||||

|
||||
|
||||
|
||||
队列的链式存储结构:
|
||||
|
||||
|
||||
```cpp
|
||||
// 链式队列节点定义
|
||||
typedef struct{
|
||||
@@ -58,7 +56,6 @@ typedef struct{
|
||||
- 出队:判断队列是否为空,队列非空则在队首移动指针,将队首指针指向下一个元素。如果队列中就一个元素,则出队后将成为空队,`Q.rear==Q.front`,最后释放元素内存空间。
|
||||
- 入队:将元素插入队尾,移动队尾指针,即便为空队列入队,由于队列带有头结点,此时就很好的避免操作队首指针了。
|
||||
|
||||
|
||||
特别注意:
|
||||
|
||||
- 用单链表表示的链式队列非常适合频繁出队、入队、元素变化大的场景
|
||||
@@ -120,7 +117,6 @@ bool IsEmptyLinkQueue(LinkQueue Q){
|
||||
|
||||
### 入队
|
||||
|
||||
|
||||
```cpp
|
||||
/*
|
||||
* @Description: 链式队列入队操作
|
||||
@@ -148,7 +144,6 @@ void EnLinkQueue(LinkQueue &Q, ElemType x){
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 出队
|
||||
|
||||
```cpp
|
||||
@@ -197,8 +192,6 @@ bool DeLinkQueue(LinkQueue &Q, ElemType &x){
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 双端队列
|
||||
|
||||
`双端队列`: 允许在两端都可以进行入队和出队操作的队列,元素的逻辑结构仍然是线性结构
|
||||
@@ -210,18 +203,13 @@ bool DeLinkQueue(LinkQueue &Q, ElemType &x){
|
||||
- 进队:前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在队列前端进的元素后面;
|
||||
- 出队:无论是前端还是后端出队,先出的的元素排列在后出的元素的前面
|
||||
|
||||
|
||||
在双端队列的基础上,还衍生出:
|
||||
|
||||
- `输入受限的双端队列`:允许在一端进行插入和删除操作,但在另外一端只允许进行删除的双端队列
|
||||
- `输出受限的双端队列`:允许在一端进行插入和删除曹组,但在另外一端只允许进行插入的双端队列
|
||||
|
||||
|
||||
当然,如果`限定双端队列从某个断点插入的元素只能从该端点删除`,那么此时的双端队列就演变为两个栈底相邻的栈了。
|
||||
|
||||
|
||||
|
||||
|
||||
## 知识补充
|
||||
|
||||
- 最适合用来链队的链表是:`带队首指针和队尾指针的非循环单链表`
|
||||
@@ -230,8 +218,7 @@ bool DeLinkQueue(LinkQueue &Q, ElemType &x){
|
||||
- 不论是顺序存储还是链式存储,**栈和队列都只能进行顺序存取(本质是线性表)**。数组是可以做到随机存取(本质是顺序表)
|
||||
- 队列先进先出的特性:`先进队列的元素先出队列,后进队列的元素后出队列`
|
||||
|
||||
|
||||
特别注意:
|
||||
|
||||
队列用链表形式存储时,删除元素,需要从队头删除,一般情况下,仅仅修改头指针,但是如果此时队列中
|
||||
仅有一个元素,则尾指针也是需要被修改的。**因为队列中只有一个元素时,删除后队列为空,需要修改尾指针为:`rear=front`**
|
||||
仅有一个元素,则尾指针也是需要被修改的。**因为队列中只有一个元素时,删除后队列为空,需要修改尾指针为:`rear=front`**
|
||||
|
||||
@@ -10,7 +10,6 @@ head:
|
||||
|
||||
> Tips: 这里不会做过多文字介绍相关应用,具体需要自己看书、查资料揣摩
|
||||
|
||||
|
||||
```mindmap
|
||||
root(栈VS队列补充)
|
||||
栈的应用
|
||||
@@ -19,29 +18,25 @@ root(栈VS队列补充)
|
||||
矩阵的压缩存储
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 栈的应用
|
||||
## 栈的应用
|
||||
|
||||
- 括号匹配
|
||||
- 表达式求值
|
||||
|
||||
> 表达式求值是程序设计语言编译中一个最基本的问题,类似有前缀、中缀、后缀表达式转换等典型问题。
|
||||
|
||||
- 递归
|
||||
|
||||
这里重点总结下递归,递归非常重要,是一种很经典的程序设计方法
|
||||
|
||||
> 递归的简单定义: 如果在一个函数、过程或数据结构的定义中又应用了自身,那么这个函数、过程或者数据结构称为递归定义的,简称递归。
|
||||
|
||||
|
||||
|
||||
递归通常把一个大型的复杂问题,层层转化为一个与原问题相似的规模较小的问题来求解。
|
||||
|
||||
**递归策略只需要少量的代码就可以描述出解题过程所需要的多次重复的计算,很大程度上减少了程序的代码量,当时通常情况下,递归的效率并不是很高**
|
||||
|
||||
|
||||
经典的斐波拉切数列,可以用递归来实现:
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
// 定义递归函数,实现斐波拉切数列
|
||||
@@ -62,7 +57,6 @@ int Fibonacci(n){
|
||||
|
||||
上面很基础的代码,是分`n=0`和`n=1`的情况,先进行过滤,其他情况下则进行递归,其实在日常开发中,经常会有简化的函数封装
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
// 定义递归函数,实现斐波拉切数列
|
||||
@@ -104,30 +98,27 @@ 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亿....)来解决,噗呲啊哈哈哈
|
||||
|
||||
**递归次数过多容易造成栈溢出,效率不高的主要原因是递归调用过程中包含很多重复的计算**
|
||||
|
||||
|
||||
### 队列的应用
|
||||
## 队列的应用
|
||||
|
||||
- 层次遍历
|
||||
|
||||
@@ -135,23 +126,19 @@ int Fibonacci(n){
|
||||
|
||||
- 计算机系统
|
||||
|
||||
|
||||
队列在计算机系统中的应用非常广泛,作用:
|
||||
|
||||
- 解决主机和外部设备之间速度不匹配的问题(例如:内存和打印机)
|
||||
- 解决由多用户引起的资源竞争问题(例如:操作系统中的进程调度...)
|
||||
|
||||
|
||||
其实,队列在计算机系统的中应用, 在看完操作系统那本书后,就会很好理解,建议学到这里,也去翻翻操作系统,汤晓丹那本很经典哟...
|
||||
|
||||
|
||||
# 特殊矩阵的压缩存储
|
||||
## 特殊矩阵的压缩存储
|
||||
|
||||
> 这部分知识我个人觉得以了解为主,复习、学习的时候还是要以前面的部分为主!
|
||||
|
||||
矩阵在`计算机图形学`、`工程计算`中占有举足轻重的地位。
|
||||
|
||||
|
||||
### 数组的定义
|
||||
|
||||
`数组`: 由n(n≥1)个相同类型的数据元素构成的有限序列。
|
||||
@@ -159,21 +146,19 @@ int Fibonacci(n){
|
||||
每个数据元素称为一个数组元素,同时每个元素受n个线性关系的约束,**每个元素在n个线性关系中的序号称为元素的`下标`**,称为该数组为n的数组。
|
||||
|
||||
数组和线性表的关系:
|
||||
|
||||
- 数组是线性表的推广。
|
||||
- 数组一旦被定义,维数和维界就不再改变。
|
||||
- 除了结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。
|
||||
|
||||
|
||||
一维数组可以看做是一个线性表
|
||||
|
||||
二维数组可以看做元素是线性表的线性表
|
||||
|
||||
....
|
||||
|
||||
|
||||
### 矩阵的压缩存储
|
||||
|
||||
|
||||
`压缩存储`:多个值相同的元素只分配一个存储空间,对零元素不分配存储空间---->节省存储空间。
|
||||
|
||||
`特殊矩阵`:具有很多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。
|
||||
@@ -187,18 +172,14 @@ int Fibonacci(n){
|
||||
|
||||
`稀疏矩阵`:矩阵元素个数s相对于矩阵中非零元素的个数t来说非常多、差距非常大,即`s>>t的矩阵`可以叫`稀疏矩阵`
|
||||
|
||||
|
||||
注意:
|
||||
|
||||
- 常规方法来存储稀疏矩阵,会想当浪费存储空间,所以稀疏矩阵只需要存储非零元素
|
||||
- 通常非零元素的分布是没有规律的,除了存储非零元素外,还需要存储元素所在位置的行和列
|
||||
- 寻相互存储三元组 `<行标,列表,值>`
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
三元组的结点存储了行标(row)、列表(col)、值(value)三种信息,是主要用来存储稀疏矩阵的一种数据结构。
|
||||
|
||||
|
||||
**注意:矩阵压缩存储的目的就是为了节省空间,已经存过的就不存或者少存(经典想法)**
|
||||
**注意:矩阵压缩存储的目的就是为了节省空间,已经存过的就不存或者少存(经典想法)**
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 栈和队列
|
||||
|
||||

|
||||

|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 基本概念
|
||||
# 基本概念
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 二叉树
|
||||
# 二叉树
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 二叉树的遍历
|
||||
# 二叉树的遍历
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 线索二叉树
|
||||
# 线索二叉树
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 树和森林
|
||||
# 树和森林
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 树的应用
|
||||
# 树的应用
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 一些总结
|
||||
# 一些总结
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
@@ -10,7 +10,6 @@ head:
|
||||
|
||||
> 强调线性表是一种逻辑结构,不是存储结构
|
||||
|
||||
|
||||
```mindmap
|
||||
root(数据结构三要素)
|
||||
逻辑结构
|
||||
@@ -22,18 +21,15 @@ root(数据结构三要素)
|
||||
数据的运算
|
||||
```
|
||||
|
||||
|
||||
## 定义
|
||||
|
||||
线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。一般表示:
|
||||
|
||||
L=(a<sub>1</sub>,a<sub>2</sub>,a<sub>3</sub>......a<sub>n</sub>) 其中n可以理解为表长(线性表的长度),n=0时候,即表空
|
||||
|
||||
|
||||
- `表头元素`:线性表中唯一的“第一个”数据元素,例如a<sub>1</sub>
|
||||
- `表尾元素`:线性表中唯一的“最后一个”数据元素,例如a<sub>n</sub>
|
||||
|
||||
|
||||
重要逻辑特性:
|
||||
|
||||
- 除表头元素外,线性表中每个元素有且仅有一个`直接前驱`
|
||||
@@ -47,11 +43,8 @@ L=(a<sub>1</sub>,a<sub>2</sub>,a<sub>3</sub>......a<sub>n</sub>) 其中n可以
|
||||
- 元素的**数据类型都相同**(强调相同数据类型),每个数据元素占用相同大小的存储空间
|
||||
- 元素具有**抽象性**,仅仅讨论元素之间的逻辑关系,不需要去考虑元素究竟表示的什么内容
|
||||
|
||||
|
||||
> Tips: **线性表是一种逻辑结构**,表示元素之间一对一的相邻关系。**顺序表和链表则指的是存储结构**
|
||||
|
||||
|
||||
|
||||
## 基本操作
|
||||
|
||||
- `InitList(&L)`: **初始化表**。构造空的线性表
|
||||
@@ -64,7 +57,4 @@ L=(a<sub>1</sub>,a<sub>2</sub>,a<sub>3</sub>......a<sub>n</sub>) 其中n可以
|
||||
- `Empty(L)`:**判空操作**。当表L为空,则返回true,否则返回false
|
||||
- `DestoryList(&L)`:**销毁操作**。将线性表销毁,释放线性表L所占用的内存空间(类似:释放内存)
|
||||
|
||||
|
||||
线性表是具有相同的数据类型的有限个数据元素组成的,**数据元素是由数据项组成的**
|
||||
|
||||
|
||||
|
||||
@@ -1,274 +0,0 @@
|
||||
---
|
||||
title: 顺序表示
|
||||
#description:
|
||||
permalink: /manuscripts/ds/linear-table-sequential-representation.html
|
||||
head:
|
||||
- [meta, { name: 数据结构 , content: 线性表的顺序表示 }]
|
||||
---
|
||||
# 线性表的顺序表示
|
||||
|
||||
|
||||
```mindmap
|
||||
root(数据结构三要素)
|
||||
逻辑结构
|
||||
存储(物理)结构
|
||||
顺序存储
|
||||
链式存储
|
||||
索引存储
|
||||
散列(Hash)存储
|
||||
数据的运算
|
||||
```
|
||||
|
||||
## 定义
|
||||
|
||||
`顺序表`:顺序存储的线性表,**是用一组地址连续的存储单元,依次存储线性表中的数据元素,使得在逻辑上相邻的两个元素在物理位置上也相邻。**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
顺序表中的元素的逻辑顺序与实际的物理位置相同
|
||||
|
||||
|
||||
|
||||
注意:
|
||||
|
||||
- 线性表中的元素的位序是从1开始的,例如1、2、3...
|
||||
- 数组中的元素的下标是从0开始的,例如0、1、2...
|
||||
|
||||
```c
|
||||
# define MaxSize 20 // 定义常量MaxSize 用来声明顺序表的最大长度
|
||||
|
||||
// 线性表结构体定义【ElemType用来代指顺序表中元素的类型,例如高级语言中的int、string....】
|
||||
typedef struct{
|
||||
ElemType data[MaxSize]; // 顺序表的元素
|
||||
int length; // 顺序表的长度
|
||||
}SqList
|
||||
|
||||
```
|
||||
|
||||
### 存储分配
|
||||
|
||||
`静态分配`:数组的大小和空间都是实现确定好的,一旦存储空间占满就会产生溢出,直接导致程序崩溃。(有点内存不够,宕机重启的意思....)
|
||||
|
||||
`动态分配`:存储数据的空间在程序执行过程中通过`动态存储分配语句`分配的,即便是数据空间占满,也可以另外开辟一块更大的空间,来替换原来的存储空间,满足扩充数据空间的目的。(有点动态规划的意思....)最重要的是:**不需要像静态分配那样,一次性地固定线性表的空间和大小**
|
||||
|
||||
|
||||
|
||||
```c
|
||||
#define InitSize 100 // 表长度初始化
|
||||
|
||||
|
||||
// 动态分配数组顺序表的结构体定义
|
||||
typedef struct{
|
||||
ElemType *data; // 动态分配数组的指针
|
||||
int MaxSize,length; // 数组的最大容量和当前元素个数
|
||||
}SqList;
|
||||
|
||||
```
|
||||
|
||||
动态分配语句
|
||||
|
||||
```C
|
||||
// C语言中
|
||||
|
||||
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
|
||||
|
||||
|
||||
// C++ 中
|
||||
|
||||
L.data=new ElemType[InitSize];
|
||||
|
||||
```
|
||||
|
||||
`malloc()函数`: 指针型函数,返回的指针指向该分配域的开头的位置。作用是在内存的动态存储区中分配一个长度为size的连续空间。[百度百科](https://baike.baidu.com/item/malloc%E5%87%BD%E6%95%B0/8582146?fr=aladdin)
|
||||
|
||||
**动态分配不是链式存储,而是属于顺序存储结构**,动态分配的物理结构没有改变,依然是随机存取的方式。只是分配的空间大小可以在运行时决定;
|
||||
|
||||
|
||||
### 顺序表的特点
|
||||
|
||||
|
||||
- 随机访问【这是最主要的特点】,通过存储起始地址和元素序号O(1)时间内访问指定元素。
|
||||
- 存储密度高,没有结点只存储数据元素,不像索引存储那样,还需要索引表什么的..
|
||||
- 逻辑上相邻的元素物理上也相邻,插入和删除需要移动大量元素
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 基本操作
|
||||
|
||||
|
||||
### 插入
|
||||
|
||||
在顺序表L的第i(1≤i≤L.length+1)个位置插入新的元素e
|
||||
|
||||
- 第一步:如果i非法,则直接返回false,插入失败,结束插入过程
|
||||
- 第二步:i正常,将表的第i个元素以及后面的所有元素都像有移动一个位置,在腾出来的空位置插入元素e
|
||||
- 第三步:顺序表插入成功,返回true
|
||||
|
||||
注意:先判空和临界值,提高算法健壮性
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
* 顺序表的插入操作
|
||||
*
|
||||
*/
|
||||
bool ListInsert(SqList &L, int i, ElemType e){
|
||||
|
||||
// i非法 i=1 表头 i=L.length+1 表尾巴
|
||||
if(i<1||i>L.length+1){
|
||||
return false;
|
||||
}
|
||||
|
||||
// 存储空间满,无法插入
|
||||
if(L.length >= MaxSize){
|
||||
return false;
|
||||
}
|
||||
|
||||
// 遍历,将位置元素往后移动,注意从后往前循环,避免值被覆盖
|
||||
for(int j=L.length; j>=i;j--){
|
||||
L.data[j]=L.data[j-1];
|
||||
}
|
||||
|
||||
// 此时,表L中的第i个元素和第i+1元素素值一样,将新元素存入i位置即可
|
||||
|
||||
// 第i个元素,对应的位置角标为i-1
|
||||
L.data[i-1]=e;
|
||||
|
||||
// 表长度加1
|
||||
L.length++;
|
||||
|
||||
// 返回插入成功
|
||||
return true;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
注意:区别顺序表中的位序和角标;
|
||||
|
||||
**时间复杂度**
|
||||
|
||||
- 最好情况:在表尾插入,元素向后移动循环没有执行,时间复杂度O(1);
|
||||
- 最坏情况:在表头插入,元素后移循环执行n次,时间复杂度为O(n);
|
||||
- 平均情况:随机插入,平均次数为:n/2,对应的平均复杂度为O(n);
|
||||
|
||||
|
||||
**线性表插入算法的平均时间复杂度为:O(n)**
|
||||
|
||||
> Tips: 需要根据实现代码理解循环为什么是从后往前来实现元素后移,通过for循环可以很明显的看出表尾插入快,表头插入慢
|
||||
|
||||
### 删除
|
||||
|
||||
删除顺序表L中第i(1≤i≤L.length+1)个位置的元素
|
||||
|
||||
- 成功,返回true,将被删除的元素用引用变量返回;
|
||||
- 失败,返回false
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
* 顺序表的删除操作
|
||||
*
|
||||
*/
|
||||
bool ListDelete(SqList &L, int i, ElemType &e){
|
||||
|
||||
// i非法 i=1 表头 i=L.length+1 表尾巴
|
||||
if(i<1||i>L.length+1){
|
||||
return false;
|
||||
}
|
||||
|
||||
// 存储空间满,无法插入
|
||||
if(L.length >= MaxSize){
|
||||
return false;
|
||||
}
|
||||
|
||||
// 引用变量e赋值
|
||||
e=L.data[i-1]
|
||||
|
||||
// 遍历,第i个元素后面的往前移动
|
||||
for(int j=i; j<=L.length;j++){
|
||||
// 从第i个元素开始,角标从i-1开始
|
||||
L.data[j-1]=L.data[j];
|
||||
}
|
||||
|
||||
// 此时,表L中的表尾元素和倒数第二个元素值一样,将表的长度-1
|
||||
|
||||
// 表长度减1
|
||||
L.length--;
|
||||
|
||||
// 返回删除成功
|
||||
return true;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
从这里来看,删除、插入元素都会涉及到大量的元素的移动(最好情况例外),总结而言:
|
||||
- 元素从后往前移,循环从前往后遍历
|
||||
- 元素从前往后移,循环从后往前遍历
|
||||
|
||||
|
||||
**时间复杂度:**
|
||||
|
||||
|
||||
- 最好情况:删除表尾元素,不需要移动任何元素,时间复杂度为O(1);
|
||||
- 最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为O(n);
|
||||
- 平均情况:随机删除,平均需要(n-1)/2,对应的时间复杂度为O(n);
|
||||
|
||||
|
||||
|
||||
**线性表删除算法的平均时间复杂度为O(n);**
|
||||
|
||||
|
||||
### 按值查找(顺序查找)
|
||||
|
||||
在顺序表L中查找第一个元素值等于e的元素,并返回位序
|
||||
|
||||
|
||||
```cpp
|
||||
/*
|
||||
* @Description: 顺序表的按值查找(顺序查找)
|
||||
* @Version: Beta1.0
|
||||
* @Author: 【B站&公众号】Rong姐姐好可爱
|
||||
* @Date: 2020-02-23 07:48:26
|
||||
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
|
||||
* @LastEditTime: 2020-02-23 07:48:26
|
||||
*/
|
||||
int LocateElem(SqList L,ElemType e){
|
||||
int i;
|
||||
// 循环判断
|
||||
for(i=0;i<L.length;i++){
|
||||
if(L.data[i]===e){
|
||||
// i是元素的角标,i+1是具体元素的位序号
|
||||
return i+1;
|
||||
}
|
||||
}
|
||||
|
||||
// 未命中,返回0,即:没有
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
注意理解`位序`的含义,即元素在线性表中的位置序号,角标为`i`(角标从0开始),对应的位序为`i+1`(位序从1开始)。当返回为0时,则直接代表没有`命中`;
|
||||
|
||||
|
||||
**时间复杂度:**
|
||||
|
||||
- 最好情况:查找的元素在表头,只需要比较一次,循环成本最小,时间复杂度为O(1);
|
||||
- 最坏情况:查找的元素在表尾或者不存在,需要完整遍历,比较n次,时间复杂度为O(n);
|
||||
- 平均情况:随机查找表上的第i个(1≤i≤L.length)元素,平均次数为(n+1)/2,对应时间复杂度为O(n)
|
||||
|
||||
|
||||
|
||||
**线性表按值查找(顺序查找)的平均时间复杂度为O(n);**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**顺序存取是读写方式,不是存储结构;顺序存储是存储结构,包括有:顺序存储、链式存储、索引存储、散列存储**
|
||||
@@ -17,17 +17,12 @@ root(链式表示)
|
||||
|
||||
顺序表的插入、删除操作需要移动大量元素,影响了运行效率(虽然时间复杂度为O(1)的情况也存在)。
|
||||
|
||||
|
||||
**链式存储线性表时,不需要使用连续的存储单元,不要求逻辑上相邻的两个元素在物理位置上也相邻**
|
||||
|
||||
|
||||
理解“链”的含义,链条--->捆绑、指向------>指针
|
||||
|
||||
|
||||
**链式存储线性表时,对线性表的插入、删除元素是不需要移动元素的,只是需要修改指针**
|
||||
|
||||
|
||||
|
||||
## 单链表
|
||||
|
||||
```mindmap
|
||||
@@ -43,16 +38,14 @@ root(单链表)
|
||||
计算表长
|
||||
```
|
||||
|
||||
|
||||
### 基本概念
|
||||
|
||||
线性表的链式存储称作`单链表`,通过**一组任意的存储单元**来存储线性表中的数据元素。
|
||||
|
||||
|
||||
每个链表结点(node)除了存放元素自身的信息外,还需要存放一个指向其后继结点的指针。目的是:**通过指针建立起链表元素之间的线性关系**
|
||||
|
||||
|
||||
单链表中结点类型的描述:
|
||||
|
||||
```cpp
|
||||
|
||||
// 单链表结点类型定义
|
||||
@@ -63,17 +56,12 @@ typeof struct LNode{
|
||||
|
||||
```
|
||||
|
||||
|
||||
单链表可以解决顺序表需要大量连续存储空间的缺点,但是单链表在数据域的基础上附加了指针域,存在浪费存储空间的缺点;
|
||||
|
||||
|
||||
单链表的元素是**离散地分布**在存储空间中的,因此**单链表是非随机存取的存储结构**,不能直接找到表中特定的结点,需要从头开始遍历、一次查找;
|
||||
|
||||
|
||||
通常,**头指针用来标识一个单链表**。头指针指向`NULL`时,标识单链表为空。
|
||||
|
||||
|
||||
|
||||
### 头结点
|
||||
|
||||
为了操作上的方便,在单链表第一个结点之前附加一个结点,叫做**头结点**。
|
||||
@@ -81,9 +69,6 @@ typeof struct LNode{
|
||||
- 头结点的数据域可以不存任何信息、也可以记录表长等基础信息
|
||||
- 头结点的指针域指向线性表的第一个元素结点;
|
||||
|
||||
|
||||
|
||||
|
||||
**不论单链表是否带头结点(可选),头指针始终指向链表的第一个结点。**
|
||||
|
||||
头结点是带头结点的链表中的第一个结点【重要】
|
||||
@@ -91,19 +76,15 @@ typeof struct LNode{
|
||||
- 头结点的数据域可以不存任何信息、也可以记录表长等基础信息
|
||||
- 头结点的指针域指向线性表的第一个元素结点;
|
||||
|
||||
|
||||
头结点的优点:
|
||||
|
||||
- 因为开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表的其他位置上的操作一致,不需要进行特殊处理;
|
||||
- 无论链表是否为空,头指针始终是指向头结点的头结点的非空指针【空表中,往往就只有头结点,此时头结点的指针域为空,可以有效避免头指针空指针异常问题】-----> **头结点的引入,很好的统一了空表和非空表的操作;**
|
||||
|
||||
|
||||
|
||||
### 头插法
|
||||
|
||||
> 从空表开始,生成新的结点,将读取的数据存放在新结点的数据域中,将新结点插入到当前链表的表头【头结点之后】
|
||||
|
||||
|
||||
```cpp
|
||||
/*
|
||||
* @Description: 单链表头插法创建
|
||||
@@ -147,14 +128,12 @@ LinkList CreateListWithStartNode(LinkList &L){
|
||||
- 读入数据的顺序与生成的链表中的元素顺序是相反的【结合队列先进先出思考】
|
||||
- 每个结点插入的时间复杂度为O(1),单链表长度为n时,头插法的时间复杂度为O(n)【结合算法中的while循环,可以很明确看出时间复杂度】
|
||||
|
||||
|
||||
### 尾插法
|
||||
|
||||
头插法建立的单链表,链表中结点的次序和输入数据的顺序不一致【相反】,尾插法则很好的避免了这个问题;
|
||||
|
||||
>新结点插入到当前链表的表尾上,必须增加一个尾指针r,始终指向当前链表的尾结点;
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
@@ -207,13 +186,10 @@ LinkList CreateListWithEndNode(LinkList &L){
|
||||
- 每个结点插入的时间复杂度为O(1),单链表长度为n时,尾巴插法的时间复杂度为O(n)【结合算法中的while循环,可以很明确看出时间复杂度】
|
||||
- 相比头插法附设了一个指向表尾结点的指针,但时间复杂度与头插法相同
|
||||
|
||||
|
||||
|
||||
### 按序号查找
|
||||
|
||||
> 在单链表中从第一个结点出发,顺指针next域逐个往下搜索、遍历,直到找出第i个结点为止,否则返回最后一个结点指针域NULL
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
/*
|
||||
@@ -261,13 +237,10 @@ LNode *GetElem(LinkList L,int i){
|
||||
|
||||
需要遍历(扫描)单链表,时间复杂度为:O(n)
|
||||
|
||||
|
||||
|
||||
### 按值查找
|
||||
|
||||
> 从单链表的第一个结点开始,从前往后依次比较表中个结点数据域的值,等于给定值e,则返回该结点的指针;若整个单链表【遍历完】中没有数据域值为e的结点,则返回NULL;
|
||||
|
||||
|
||||
```cpp
|
||||
LNode *LocateElem(LinkList L,ElemType e){
|
||||
|
||||
@@ -287,11 +260,11 @@ LNode *LocateElem(LinkList L,ElemType e){
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
链表遍历无法匹配,会返回NULL,因为在尾结点无法匹配的时候,直接返回尾结点指针域
|
||||
|
||||
需要遍历(扫描)单链表,时间复杂度为:O(n)
|
||||
|
||||
|
||||
### 结点插入
|
||||
|
||||
> 单链表中,将值为x的新结点插入到单链表的第i个位置上
|
||||
@@ -319,14 +292,10 @@ LNode *LocateElem(LinkList L,ElemType e){
|
||||
|
||||
**上面的过程不能更换,避免后继指针不存在的问题**
|
||||
|
||||
|
||||
最后的最后,一定要注意将s的数据域赋值x
|
||||
|
||||
|
||||
插入结点的时间复杂度集中在查找第(i-1)个元素,时间复杂度为O(n);如果在给定结点的后面插入新结点,只需要执行`p->next=s`操作,时间复杂度为O(1)
|
||||
|
||||
|
||||
|
||||
#### 前插操作
|
||||
|
||||
> 在某结点的前面插入一个新的结点
|
||||
@@ -337,7 +306,6 @@ LNode *LocateElem(LinkList L,ElemType e){
|
||||
|
||||
> 在某结点的后面插入一个新的结点,单链表插入算法中,通常采用后插操作的
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
// 结点s插入到结点p的前面,修改指针域,顺序不能改变
|
||||
@@ -354,17 +322,14 @@ s->data=temp;
|
||||
|
||||
上述借助临时变量`temp`来将结点s和结点p的数据域进行交换,需要开辟O(1)的空间复杂度,但是时间复杂度却从O(n)改变为O(1),典型的空间换时间策略
|
||||
|
||||
|
||||
### 删除结点
|
||||
|
||||
> 将单链表L的第i个结点元素删除;
|
||||
|
||||
|
||||
- 第一步: 先检查删除位置的合法性;
|
||||
- 第二步: 查找表中的第(i-1)个结点,即被删结点的前驱结点;
|
||||
- 第三步: 移动指针,删除结点元素;
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
// 获取删除位置结点元素的前驱结点
|
||||
@@ -383,9 +348,6 @@ free(q)
|
||||
|
||||
和插入算法一样,时间都消耗在查询前驱结点上,时间复杂度为:O(n)
|
||||
|
||||
|
||||
|
||||
|
||||
> 删除单链表L中给点结点元素*p,通常是按值查找获取到p结点的前驱元素,再执行删除操作,这样很明显会导致时间复杂度为:O(n),主要都消耗在`按值查找`上
|
||||
|
||||
这里可以利用p结点的后继结点将p结点删除
|
||||
@@ -395,7 +357,6 @@ free(q)
|
||||
- 第三步:p的指针域指向q的指针域,q结点从链中“断开”
|
||||
- 第四步:释放q的内存空间
|
||||
|
||||
|
||||
```cpp
|
||||
// 存放p的后继结点指针
|
||||
q=p->next;
|
||||
@@ -411,18 +372,14 @@ free(q)
|
||||
|
||||
相比按值查找前驱结点来删除给定的结点p,利用后继结点来删除的时间复杂度更小,为:O(1)
|
||||
|
||||
|
||||
|
||||
### 计算表长
|
||||
|
||||
> 计算单链表中数据结点(不含头结点)的个数
|
||||
|
||||
|
||||
算法思路:从第一个结点开始顺序依次访问表中的每一个结点,为此需要设置一个`计数器变量`,每访问一个结点,计算器加1,直到访问到空结点为止。
|
||||
|
||||
算法时间复杂度:O(n)
|
||||
|
||||
|
||||
**单链表的长度是不包括头结点的,不带头结点和带头结点的单链表在求表长操作上会略有不同。**
|
||||
|
||||
不带头结点的单链表,当表为空时候,需要单独处理;
|
||||
@@ -445,7 +402,6 @@ if(L->next===NULL){
|
||||
|
||||
## 双链表
|
||||
|
||||
|
||||
```mindmap
|
||||
root(双链表)
|
||||
基本特点
|
||||
@@ -453,22 +409,19 @@ root(双链表)
|
||||
删除结点
|
||||
```
|
||||
|
||||
|
||||
从单链表的结构上来看
|
||||
|
||||
- 访问特定结点的前驱结点需要遍历整个单链表,移动指针,时间复杂度为:O(n)
|
||||
- 访问特定结点的后继结点只需要移动一次指针,时间复杂度为:O(1)
|
||||
|
||||
|
||||
双链表的引入,很好的解决单链表访问前驱结点时间消耗大的问题。
|
||||
|
||||
|
||||
双链表结点由三部分组成:
|
||||
|
||||
- `数据域` 存放数据信息
|
||||
- `prior指针域` 指向结点的前驱结点
|
||||
- `next指针域` 指向结点的后继结点
|
||||
|
||||
|
||||
```cpp
|
||||
// 双链表结点类型
|
||||
typedef struct DNode{
|
||||
@@ -479,21 +432,16 @@ typedef struct DNode{
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 基本特点
|
||||
|
||||
- 双链表仅仅在单链表的结点中增加了一个指向结点前驱的`prior`指针;
|
||||
- `按值查找`、`按序号查找`在单链表和双链表上的操作是相同的。
|
||||
- 和单链表不同,`插入`、`删除`操作除了修改`next`指针域,双链表还需要修改`prior`指针域,确保不断`链`,时间复杂度都为:O(1)
|
||||
|
||||
|
||||
|
||||
|
||||
### 插入结点
|
||||
|
||||
> 在双链表中p所指的结点之后插入结点s
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
// 第一步
|
||||
@@ -531,10 +479,8 @@ free(q);
|
||||
|
||||
**第一步和第二步顺序可换**,整体时间复杂度为:O(1)
|
||||
|
||||
|
||||
## 循环链表
|
||||
|
||||
|
||||
```mindmap
|
||||
循环链表
|
||||
循环单链表
|
||||
@@ -546,12 +492,10 @@ free(q);
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 循环单链表
|
||||
|
||||
`循环单链表`是在单链表的基础上,将最后一个结点(尾结点)的指针由`NULL`改为指向`头结点`,形成`环`。【单链表----->循环单链表】
|
||||
|
||||
|
||||
```cpp
|
||||
// 双链表结点类型
|
||||
typedef struct DNode{
|
||||
@@ -566,8 +510,6 @@ typedef struct DNode{
|
||||
|
||||
**不是判断头结点的指针是否为空,而是需要判断是否等于头指针**,表为空时,头结点的next指针域其实是指向自己;
|
||||
|
||||
|
||||
|
||||
#### 特点
|
||||
|
||||
- 在循环单链表中,尾结点*p的next指针域指向链表L(即:头结点),形成了`闭环`,不存在指针域为`NULL`的结点。
|
||||
@@ -576,14 +518,10 @@ typedef struct DNode{
|
||||
- **循环单链表可以抽象为时钟,形成的`环`是有顺序的;**
|
||||
- 频繁的`表头`和`表尾`操作,可以对循环单链表设置`尾指针`,而不设置`头指针`,明确尾指针r后,头指针即为:`r->next` ,减少头指针到尾指针间的遍历,时间复杂度:O(n)---->O(1)
|
||||
|
||||
|
||||
|
||||
|
||||
### 循环双链表
|
||||
|
||||
`循环双链表`是在双链表的基础上,将`尾结点`的`next`指针指向`头结点`,将`头结点`的`prior`指针指向`尾结点`。【双链表----->循环双链表】
|
||||
|
||||
|
||||
```cpp
|
||||
// 双链表结点类型
|
||||
typedef struct DNode{
|
||||
@@ -601,12 +539,10 @@ typedef struct DNode{
|
||||
- p->next=L
|
||||
- p->prior=L
|
||||
|
||||
|
||||
#### 基本特点
|
||||
|
||||
- 从双向链表中的任意一个结点开始,都可以很方便地访问它的`前驱结点`和`后继结点`。
|
||||
|
||||
|
||||
## 静态链表
|
||||
|
||||
```mindmap
|
||||
@@ -624,16 +560,12 @@ root(链式表示)
|
||||
|
||||
> 借助数组来描述线性表的链式存储结构,结点元素同样存在数据域`data`和指针域`next`
|
||||
|
||||
|
||||
注意: 和普通的链表的指针域不同的是,静态链表的指针是结点元素的相对地址(数组下标),也称为`游标`,建议结合高级语言中数组的概念来理解;
|
||||
|
||||
|
||||
**与顺序表一样,虽然静态链表属于链表,但是存储时需要预先分配一块连续的内存空间**
|
||||
|
||||
|
||||
静态链表结构类型:
|
||||
|
||||
|
||||
```cpp
|
||||
|
||||
// 定义静态链表的最大长度
|
||||
@@ -648,9 +580,6 @@ typedef struct{
|
||||
|
||||
很显然,静态链表是通过`数组游标`来访问下一个结点元素,可以和`指针域`的相关概念结合理解;
|
||||
|
||||
|
||||
- 静态链表以`next=-1`作为结束的标志【尾结点】
|
||||
- 和动态链表相同,**插入、删除操作不需要移动元素,只需要修改指针**;
|
||||
- 总体来说,静态链表没有单链表使用方便,需要将整个链表存储在一块连续的内存空间中,内部的存储可以分散,通过指针构成`链`的关系
|
||||
|
||||
|
||||
|
||||
@@ -25,22 +25,17 @@ root(链式表示)
|
||||
|
||||
## 顺序表和链表的比较
|
||||
|
||||
|
||||
### 存取方式
|
||||
|
||||
- 顺序表支持顺序存取和随机存取;
|
||||
- 链表只能从表头顺序存取元素,支持顺序存取;
|
||||
|
||||
|
||||
### 逻辑结构与物理结构
|
||||
|
||||
|
||||
- 顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻【一定性】。
|
||||
- 链式存储时,逻辑上相邻的元素,对应的物理存储位置不一定相邻【可以相邻,也可以不相邻】。
|
||||
- 链式存储的逻辑关系通过指针链接表示;
|
||||
|
||||
|
||||
|
||||
### 时间复杂度
|
||||
|
||||
#### 按值查找
|
||||
@@ -48,7 +43,6 @@ root(链式表示)
|
||||
- 顺序表无序的情况下,顺序表和链表的时间复杂度均为O(n)
|
||||
- 顺序表有序的情况下,顺序表的时间复杂度为O(log<sub>2</sub>n),链表的时间复杂度为O(n);
|
||||
|
||||
|
||||
**注意:O(log<sub>2</sub>n) < O(n)**
|
||||
|
||||
#### 按序号查找
|
||||
@@ -66,7 +60,6 @@ root(链式表示)
|
||||
|
||||
#### 顺序存储
|
||||
|
||||
|
||||
##### 静态分配
|
||||
|
||||
- 需要预先分配足够大的存储空间;
|
||||
@@ -79,7 +72,6 @@ root(链式表示)
|
||||
- 动态分配能够扩充存储空间,但需要移动大量元素,操作效率降低
|
||||
- 内存中没有更大块的连续存储空间,将会导致空间分配失败;
|
||||
|
||||
|
||||
#### 链式存储
|
||||
|
||||
- 链式存储的结点空间只在需要的时候申请分配
|
||||
@@ -93,8 +85,6 @@ root(链式表示)
|
||||
- 链表不用事先估计存储规模,但存储密度较低
|
||||
- 链式存储结构的存储密度小于1,不要求连续的存储空间
|
||||
|
||||
|
||||
|
||||
### 基于运算的考虑
|
||||
|
||||
- 顺序表支持随机存取,按序号查找顺序表的时间复杂度为O(1);
|
||||
@@ -102,16 +92,11 @@ root(链式表示)
|
||||
- 顺序表的插入、删除操作,平均需要移动表中一半的元素,当表的数据量较大时,这种情况需要重点考虑的。
|
||||
- 链表的插入、删除操作,也是需要找插入位置(前驱结点、后继结点),主要的操作还是比较操作,相对较好;
|
||||
|
||||
|
||||
|
||||
|
||||
### 基于环境的考虑
|
||||
|
||||
- 顺序表容易实现,任何高级语言中都有数组类型;
|
||||
- 链表操作是基于指针的,指针移动,相对复杂;
|
||||
|
||||
|
||||
|
||||
综上比较
|
||||
|
||||
- 通常比较稳定的线性表选择顺序存储;
|
||||
@@ -127,10 +112,8 @@ root(链式表示)
|
||||
- 静态链表中的指针称为`游标`,指示下一个元素在数组中的`下标`
|
||||
- 静态链表用数组表示,需要预先分配较大的连续空间,同时具有一般链表的特点(插入、删除元素不需要移动元素)
|
||||
|
||||
|
||||
### 单链表设置头结点
|
||||
|
||||
|
||||
目的
|
||||
|
||||
> 主要是方便运算。
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 线性表
|
||||
|
||||

|
||||

|
||||
|
||||
@@ -15,5 +15,3 @@
|
||||
## 输入输出系统
|
||||
|
||||
## 一些总结
|
||||
|
||||
|
||||
|
||||
@@ -14,4 +14,4 @@
|
||||
|
||||
## 应用层
|
||||
|
||||
## 一些总结
|
||||
## 一些总结
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,5 @@
|
||||
# 操作系统
|
||||
|
||||
|
||||
<a href="../../mark-map/os-map.html" target="_blank">在线预览</a>
|
||||
|
||||
## 引论
|
||||
@@ -14,4 +13,3 @@
|
||||
## I/O管理
|
||||
|
||||
## 文件管理
|
||||
|
||||
|
||||
@@ -7,10 +7,7 @@
|
||||
- <a href="../mark-map/ccp-map.html" target="_blank">计算机组成原理</a>
|
||||
- <a href="../mark-map/cn-map.html" target="_blank">计算机网络</a>
|
||||
|
||||
|
||||
[//]: # (xmind在线加载时间太长)
|
||||
[//]: # (<ClientOnly>)
|
||||
[//]: # (<XMindManager></XMindManager>)
|
||||
[//]: # (</ClientOnly>)
|
||||
|
||||
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
输入、输出管理
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 系统概述
|
||||
|
||||
- 引论
|
||||
@@ -20,13 +18,11 @@
|
||||
|
||||
## 进程管理
|
||||
|
||||
|
||||
- 进程和线程
|
||||
- 处理机调度
|
||||
- 进程同步
|
||||
- 死锁
|
||||
|
||||
|
||||
## 内存管理
|
||||
|
||||
- 引论
|
||||
@@ -40,7 +36,6 @@
|
||||
- 磁盘管理
|
||||
- 一些总结
|
||||
|
||||
|
||||
## 输入、输出管理
|
||||
|
||||
- 基本概述
|
||||
@@ -48,8 +43,6 @@
|
||||
- 高速缓存和缓冲区
|
||||
- 一些总结
|
||||
|
||||
|
||||
|
||||
## 参考资料
|
||||
|
||||
- 《计算机操作系统》 第四版 汤小丹、梁红兵、汤子瀛著
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# 引论
|
||||
# 引论
|
||||
|
||||
努力赶稿中,等等我呀...
|
||||
努力赶稿中,等等我呀...
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user