From 9ea9b830629d086057f8afc62ab553fd331b7673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Mon, 17 Sep 2018 12:02:42 +0800 Subject: [PATCH 001/151] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9=E5=88=B0?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E7=9A=84repo:=20https://github.com/nonstriat?= =?UTF-8?q?er/Learn-ML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ML/README.md | 0 ML/pre.md | 131 --------------- ...76\347\250\213\345\244\247\347\272\262.md" | 80 ---------- Math/README.md | 151 ------------------ 4 files changed, 362 deletions(-) delete mode 100644 ML/README.md delete mode 100644 ML/pre.md delete mode 100644 "ML/\350\257\276\347\250\213\345\244\247\347\272\262.md" delete mode 100644 Math/README.md diff --git a/ML/README.md b/ML/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/ML/pre.md b/ML/pre.md deleted file mode 100644 index c512416..0000000 --- a/ML/pre.md +++ /dev/null @@ -1,131 +0,0 @@ - - -## 数学是基础 - -微积分 -概率论和统计学 -线性代数(矩阵,向量) -数值数学(数值分析,线性规划,凸优化理论,常见数值优化算法) -实分析和泛函的基础 - -《统计学习方法》 李航博士 - - - -## 机器学习 - -机器学习 机器学习是近20多年兴起的一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与统计推断学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。 - -从大量数据中找到规律和知识,然后用规律和知识做预测和决策。 - - -### 监督学习 - -从给定的训练数据集中学习一个函数,当新数据到来时,可以根据这个函数预测结果。 - -Square判断一笔交易是否是欺诈,信用卡咋骗 -Airbnb 预测用户网络平台上的违规操作 -Airbnb 搜索引擎,搜索结果最大程度可能是用户感兴趣的租房 -Airbnb 预测一个房租的最佳定价范围 - - -线性回归 -决策树 - - -Aerosolve -Scikit-Learn python - - -### 无监督学习 - -从一个输入集里选择识别隐藏的有用的信息,比如从生物信息的DNA里找到负责同一个生物功能的DNA群,图像图形处理里的人脸识别。研究方法是聚类分析。 - -* 数据处理与可视化:PCA,LDA,MDS -* 聚类算法 -* 稀疏编码 - - -### 增强学习 - -通过观察来学习应该如何的动作。 - - - -机器学习偏向数学问题推导,数据挖掘就是抽特征 -不要沉迷于数学公式推导,理解如何运用数据 -动手实现一些简单的算法,如感知机,k近邻,线性回归 -找一个实际案例,从他的算法选择,特征参数选取调整,以及数据管道的建立等系统的学习一下 - - -基本不会去实现这些基础算法,都有现成的开源工具 - -概率图模型(Probabilistic graphical model) -两个核心的机器学习模型:Latent Dirichlet Allocation(LDA) Probabilistic Matrix Factorization(PMF) -统计计算(Statistical computing) -深度学习(Deep learning) -优化(optimization) -PAC学习理论(PAC Learning) -非参数贝叶斯统计(Non-parametric Bayesian statistics) - -参考链接:http://www.zhihu.com/question/21714701 - - - - - -分类器 - -* Naive Bayes -* Linear Discriminant Analysis -* Logistic Regression -* Linear SVM -* Kernel SVM -* Adaboost -* Decision -* Neural network - - - - -分类 -聚类 -模式识别 - - -SVM -贝叶斯 - -学好python - - - - - -### 数据挖掘 - -在知乎的描述中。`数据挖掘`是指从大量的数据中自动搜索隐藏于其中的有着特殊关系性的信息和知识的过程。 - - - -## 入门参考 - - -[Machine learning](https://www.coursera.org/learn/machine-learning/) Andrew Ng 在 coursera公开课。最好能完成所有作业。课程讲义http://cs229.stanford.edu/materials.html - -网易的andrew ng公开课, 这个也不错,年代久远一些。 - -[julyedu 课程大纲](http://julyedu.com/course/getDetail?course_id=34#discard) - -《机器学习基石》 https://www.coursera.org/course/ntumlone - -《机器学习技法》 公开课 - -《机器学习实战》 - -《机器学习:实用案例解析》 本书比较全面系统地介绍了机器学习的方法和技术。全书案例既有分类问题,也有回归问题;既包含监督学习,也涵盖无监督学习。本书讨论的案例从分类讲到回归,然后讨论了聚类、降维、最优化问题等。这些案例包括分类:垃圾邮件识别,排序:智能收件箱,回归模型:预测网页访问量,正则化:文本回归,最优化:密码破解,无监督学习:构建股票市场指数,空间相似度:用投票记录对美国参议员聚类,推荐系统:给用户推荐R语言包,社交网络分析:在Twitter上感兴趣的人,模型比较:给你的问题找到最佳算法。各章对原理的叙述力求概念清晰、表达准确,突出理论联系实际,富有启发性,易于理解。在探索这些案例的过程中用到的基本工具就是R统计编程语言。 - - -《Machine Learning》 Tom Mitchell -Simon Haykin的《神经网络与机器学习》 - diff --git "a/ML/\350\257\276\347\250\213\345\244\247\347\272\262.md" "b/ML/\350\257\276\347\250\213\345\244\247\347\272\262.md" deleted file mode 100644 index bc7e524..0000000 --- "a/ML/\350\257\276\347\250\213\345\244\247\347\272\262.md" +++ /dev/null @@ -1,80 +0,0 @@ -考虑到不少初学者因数学功力不足,公式不会推导而学不下去,故本次课程的前4次课帮大家重点梳理下机器学习所需要的数学知识,后面的16次课 则重实践、重应用 ,具体上课内容安排如下 [包括但远不止以下内容]: - -第1课 微积分与概率论 -Taylor展式、梯度下降和牛顿法初步、Jensen不等式、常见分布与共轭分布 - -第2课 数理统计与参数估计 -切比雪夫不等式、大数定理、中心极限定理、矩估计、极大似然估计 - -第3课 矩阵和线性代数 -特征向量、对称矩阵对角化、线性方程 - -第4课 凸优化 -凸集、凸函数、凸优化、KKT条件 - -第5课 回归 -最小二乘法、高斯分布、梯度下降、过拟合、Logistic回归 -实践示例:线性回归、Logistic回归实现和分析 - -第6课 梯度下降算法剖析 -自适应学习率、拟牛顿、LBFGS -实践示例:自适应学习率代码实现和参数调试分析 - -第7课 最大熵模型 -熵、相对熵、信息增益、最大熵模型、IIS - -第8课 聚类 -K-means/K-Medoid/密度聚类/谱聚类 -实践示例:K-means、谱聚类代码实现和参数调试分析 - -第9课 推荐系统 -协同过滤、隐语义模型pLSA/SVD、随机游走Random Walk -实践示例:协同过滤代码实现和参数调试分析 - -第10课 决策树和随机森林 -ID3、C4.5、CART、Bagging、GBDT -实践案例:使用随机森林进行数据分类 [含代码实现和参数调试分析] - -第11课 Adaboost -Adaboost、前向分步算法 - -第12课 SVM -线性可分支持向量机、线性支持向量机、非线性支持向量机、SMO -实践案例: 使用SVM进行数据分类 [含代码实现和参数调试分析] - -第13课 贝叶斯网络 -朴素贝叶斯、有向分离、马尔科夫模型/HMM/pLSA - -第14课 EM算法 -GMM、pLSA、HMM -实践案例:分解男女身高、图像分割 - -第15课 主题模型 -pLSA、共轭先验分布、LDA -实践案例:使用LDA进行文档聚类 [含代码实现和参数调试分析] - -第16课 采样与变分 -MCMC/KL(p||q)与KL(q||p) - -第17课 隐马尔科夫模型HMM -概率计算问题、参数学习问题、状态预测问题 -实践案例:使用HMM进行中文分词 [含代码实现和参数调试分析] - -第18课 条件随机场CRF -概率无向图模型、MRF、线性链CRF - -第19课 人工神经网络 -BP算法、CNN、RNN - -第20次课 深度学习 -实践案例:使用Torch进行图像分类及卷积网络可视化的深度学习实践 - - -预习 - -《高等数学·上下册》; -《概率论与数理统计·浙大版》、《数理统计学简史·陈希孺》; -《矩阵分析与应用·张贤达》; -《凸优化(Convex Optimization) · Stephen Boyd & Lieven Vandenberghe著》; -《统计学习方法·李航》; -《Pattern Recognition And Machine Learning · Christopher M. Bishop著》,简称PRML; \ No newline at end of file diff --git a/Math/README.md b/Math/README.md deleted file mode 100644 index 90bd108..0000000 --- a/Math/README.md +++ /dev/null @@ -1,151 +0,0 @@ - -## 数学 - ->数学是科学的皇后 ->数学是对自然界事实的总结和归纳,又是抽象思考的结果 ->数学是上帝描写自然的语言 —— 伽利略 - - -## 学习方法 - -* 刷题,练习 -* 避免纯数学性推导,先弄清楚每门学问要解决的问题是什么,理清知识脉络 -* 可汗学院,网易公开课,知乎,google - - -## 初等数学 - -也就是大学以前学习的数学内容。包括代数,几何,集合论等。 - -初等数学看重的是应用能力,很多定理都是靠记忆;比如很多定理,你记住它然后会懂得算就OK了。高等数学看重的是翻译能力,这个翻译指的是把逻辑翻译成数学语言。 - - - -## 微积分 - -微积分起源于资本主义工业革命,工业的发展需要精确计算各种运动如机械运动,天体运动,流体与气体运动的规律性。许多问题需要解决,归纳有下: - -1. 求即时速度 -2. 求曲线的切线问题 -3. 求函数的最大值和最小值问题 -4. 求曲线长,曲线围成的面积,曲面围成的体积,物体的重心 - - -微积分研究的对象是变量(或函数)。`极限理论`是微积分的基础。微积分包括`微分` 和 `积分` ,微分和积分互为逆运算。 - -* **微分**: 内容有 `极限理论` 、 `导数` 、`微分`, 是一套关于关于变化率的理论,将函数,速度,加速度,曲线,曲率用一套通用符号表示。 -* **积分**: 内容有`定积分 ` 和 `不定积分` , 是计算面积和体积的一套理论方法。 -* **极限理论** -* **一元微积分** -* **多元微积分** -* **空间解析几何** -* **级数理论** -* **常微分方程** - - -#### 参考 - -《常微分方程》 也是要刷题的 -《网易公开课》 - - - - -## 线性代数 - -`线性代数`是数学的另一个分支,研究对象是`向量` `矩阵` `线性变换` `线性方程组` - - -* 矩阵 -* 线性方程组 -* 向量 -* 秩与维数 -* 正交化 -* 特征值与特征向量 - - -### 参考 - -《线性代数》 李尚志 -《线性代数及其应用》 David C. Lay -[《网易公开课》](http://c.open.163.com/search/search.htm?query=%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0#/search/all) - - - -## 概率论与数理统计 - - -* 随机变量 -* 概率分布 -* 随机变量的数字特征 -* 参数估计 -* 假设检验 -* 回归分析 - - - -### 应用领域 - -* 实现winzip -* 基于全概率公式的贝叶斯分类算法,数据挖掘,自然语言处理 -* 垃圾邮件过滤 -* 打tag -* 网络性能分析,评估服务质量 - - -更多应用可以看看[知乎这里的讨论](http://www.zhihu.com/question/25047877) - -### 参考 - -《概率论与数理统计》 陈希儒 - - - -## 离散数学 - - ->一切算法的基础都是离散数学 ->一切加密的理论基础都是离散数学 ->编程时候很多奇怪的小技巧(特别是所有和位计算相关的东西)核心也是离散数学 -> from 知乎网友:http://www.zhihu.com/question/38040913 - -离散数学可以看做是数学和计算机之间的桥梁。计算机只懂得离散。 - -离散数学是计算机算法的基础 - -离散数学最重要的两个内容:`数论`和`图论`。 - - -* 集合论 -* 数理逻辑 -* 图论 - - - -#### 应用领域 - -算法 -语言信息处理 -数据挖掘和机器学习 - - - - -## 推荐阅读 - -《统计学习方法》 李航 -《高等数学·上下册》 -《概率论与数理统计·浙大版》、《数理统计学简史·陈希孺》 -《概率论与数理统计》 陈希儒 -《线性代数》 李尚志 -《线性代数及其应用》 David C. Lay -《矩阵分析与应用·张贤达》 -《凸优化(Convex Optimization) · Stephen Boyd & Lieven Vandenberghe著》 -《Pattern Recognition And Machine Learning · Christopher M. Bishop著》,简称PRML - - -《数学之美》 吴军 -《思考的乐趣》《Matrix67数学笔记》 顾森 ,网名[Matrix67](http://www.matrix67.com/blog/) - - - From 44e2992fbcfaad36a2feb4189740e69eb10bfc25 Mon Sep 17 00:00:00 2001 From: Ir1dXD Date: Wed, 3 Oct 2018 11:20:43 +0800 Subject: [PATCH 002/151] add OI Wiki --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 57832b0..e3ec032 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,7 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html [算法设计与分析 Design and Analysis of Algorithms](https://class.coursera.org/algorithms-001/lecture) 由北大教授Wanling Qu在coursera讲授的一门算法课程。首先介绍一些与算法有关的基础知识,然后阐述经典的算法设计思想和分析技术,主要涉及的算法设计技术是:分治策略、动态规划、贪心法、回溯与分支限界等。每个视频都配有相应的讲义(pdf文件)以便阅读和复习。 +[OI Wiki](https://github.com/24OI/OI-wiki/) 主要内容是 OI / ACM-ICPC 相关的知识整理。 From ac428ebb4934a2cde5bd39a449906a7ed6743d87 Mon Sep 17 00:00:00 2001 From: Ninjaboi17 <43075004+Ninjaboi17@users.noreply.github.com> Date: Sat, 27 Oct 2018 16:06:51 +0530 Subject: [PATCH 003/151] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 57832b0..8fa42cb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +#The file is in Chinese >算法虐我千百遍,我待算法如初恋 From 63ba09a6f53861d8ef21d4e591397ed4b237b9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Wed, 12 Dec 2018 11:19:34 +0800 Subject: [PATCH 004/151] update dir name --- {Big Data => Algorithms In Big Data}/Bitmap.md | 0 ...232\206\350\277\207\346\273\244\345\231\250).md" | 0 ...\210\206\350\200\214\346\262\273\344\271\213.md" | 0 {Big Data => Algorithms In Big Data}/README.md | 0 .../btree_insert.gif | Bin .../disk_search.png | Bin .../simhash\347\256\227\346\263\225.md" | 0 ...\222\347\264\242\345\274\225(Inverted Index).md" | 0 ...345\244\204\347\220\206\344\271\213Mapreduce.md" | 0 ...\261\202\346\241\266\345\210\222\345\210\206.md" | 0 .../\345\244\226\346\216\222\345\272\217.md" | 0 ...\215\256\345\272\223\347\264\242\345\274\225.md" | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename {Big Data => Algorithms In Big Data}/Bitmap.md (100%) rename "Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" => "Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" (100%) rename "Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" => "Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" (100%) rename {Big Data => Algorithms In Big Data}/README.md (100%) rename {Big Data => Algorithms In Big Data}/btree_insert.gif (100%) rename {Big Data => Algorithms In Big Data}/disk_search.png (100%) rename "Big Data/simhash\347\256\227\346\263\225.md" => "Algorithms In Big Data/simhash\347\256\227\346\263\225.md" (100%) rename "Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" => "Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" (100%) rename "Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" => "Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" (100%) rename "Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" => "Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" (100%) rename "Big Data/\345\244\226\346\216\222\345\272\217.md" => "Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" (100%) rename "Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" => "Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" (100%) diff --git a/Big Data/Bitmap.md b/Algorithms In Big Data/Bitmap.md similarity index 100% rename from Big Data/Bitmap.md rename to Algorithms In Big Data/Bitmap.md diff --git "a/Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" "b/Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" similarity index 100% rename from "Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" rename to "Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" diff --git "a/Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" "b/Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" similarity index 100% rename from "Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" rename to "Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" diff --git a/Big Data/README.md b/Algorithms In Big Data/README.md similarity index 100% rename from Big Data/README.md rename to Algorithms In Big Data/README.md diff --git a/Big Data/btree_insert.gif b/Algorithms In Big Data/btree_insert.gif similarity index 100% rename from Big Data/btree_insert.gif rename to Algorithms In Big Data/btree_insert.gif diff --git a/Big Data/disk_search.png b/Algorithms In Big Data/disk_search.png similarity index 100% rename from Big Data/disk_search.png rename to Algorithms In Big Data/disk_search.png diff --git "a/Big Data/simhash\347\256\227\346\263\225.md" "b/Algorithms In Big Data/simhash\347\256\227\346\263\225.md" similarity index 100% rename from "Big Data/simhash\347\256\227\346\263\225.md" rename to "Algorithms In Big Data/simhash\347\256\227\346\263\225.md" diff --git "a/Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" "b/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" similarity index 100% rename from "Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" rename to "Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" diff --git "a/Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" "b/Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" similarity index 100% rename from "Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" rename to "Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" diff --git "a/Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" "b/Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" similarity index 100% rename from "Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" rename to "Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" diff --git "a/Big Data/\345\244\226\346\216\222\345\272\217.md" "b/Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" similarity index 100% rename from "Big Data/\345\244\226\346\216\222\345\272\217.md" rename to "Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" diff --git "a/Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" "b/Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" similarity index 100% rename from "Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" rename to "Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" From 52b86e2cb2bb58285b6cba47e7928d4b162c8695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Wed, 12 Dec 2018 11:22:48 +0800 Subject: [PATCH 005/151] update readme --- README.md | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 57832b0..a624220 100644 --- a/README.md +++ b/README.md @@ -170,41 +170,40 @@ ### 刷题必备 -《剑指offer》 -《编程之美》 -《编程之法:面试和算法心得》   -《算法谜题》 都是思维题 +*《剑指offer》 +*《编程之美》 +*《编程之法:面试和算法心得》   +*《算法谜题》 都是思维题 ### 基础 -《编程珠玑》Programming Pearls -《编程珠玑(续)》 -《数据结构与算法分析》 -《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见介绍细致 +*《编程珠玑》Programming Pearls +*《编程珠玑(续)》 +*《数据结构与算法分析》 +*《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见介绍细致 ### 算法设计 -《算法设计与分析基础》 -《算法引论》 告诉你如何创造算法 断货 -《Algorithm Design Manual》算法设计手册 红皮书 - -《算法导论》 是一本对算法介绍比较全面的经典书籍 +*《算法设计与分析基础》 +*《算法引论》 告诉你如何创造算法 断货 +*《Algorithm Design Manual》算法设计手册 红皮书 +*《算法导论》 是一本对算法介绍比较全面的经典书籍 -《Algorithms on Strings,Trees and Sequences》 -《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块 +*《Algorithms on Strings,Trees and Sequences》 +*《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块 ### 延伸阅读 -《深入理解计算机系统》 -《TCP/IP详解三卷》 -《UNIX网络编程二卷》 -《UNIX环境高级编程:第2版》 +*《深入理解计算机系统》 +*《TCP/IP详解三卷》 +*《UNIX网络编程二卷》 +*《UNIX环境高级编程:第2版》 -《The practice of programming》 Brian Kernighan和Rob Pike -《writing efficient programs》 优化 -《The science of programming》 证明代码段的正确性 800块一本 +*《The practice of programming》 Brian Kernighan和Rob Pike +*《writing efficient programs》 优化 +*《The science of programming》 证明代码段的正确性 800块一本 ## 参考链接和学习网站 @@ -231,11 +230,10 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html ### 编程网站 -[leetcode](http://leetcode.com/) -[openjudge](http://openjudge.cn/) 开放在线程序评测平台,可以创建自己的OJ小组   -[九度OJ](http://ac.jobdu.com/index.php) - -这有个[ACM训练方案](http://www.java3z.com/cwbwebhome/article/article19/res041.html) +* [leetcode](http://leetcode.com/) +* [openjudge](http://openjudge.cn/) 开放在线程序评测平台,可以创建自己的OJ小组   +* [九度OJ](http://ac.jobdu.com/index.php) +* 这有个[ACM训练方案](http://www.java3z.com/cwbwebhome/article/article19/res041.html) ### 其它 From 7873fe4dceb2eb60acb5de4a38811a49b9a9e2b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Wed, 12 Dec 2018 11:24:27 +0800 Subject: [PATCH 006/151] update readme --- README.md | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index a624220..4e7b22e 100644 --- a/README.md +++ b/README.md @@ -170,56 +170,56 @@ ### 刷题必备 -*《剑指offer》 -*《编程之美》 -*《编程之法:面试和算法心得》   -*《算法谜题》 都是思维题 +* 《剑指offer》 +* 《编程之美》 +* 《编程之法:面试和算法心得》   +* 《算法谜题》 都是思维题 ### 基础 -*《编程珠玑》Programming Pearls -*《编程珠玑(续)》 -*《数据结构与算法分析》 -*《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见介绍细致 +* 《编程珠玑》Programming Pearls +* 《编程珠玑(续)》 +* 《数据结构与算法分析》 +* 《Algorithms》 这本近千页的书只有6章,其中四章分别是排序,查找,图,字符串,足见介绍细致 ### 算法设计 -*《算法设计与分析基础》 -*《算法引论》 告诉你如何创造算法 断货 -*《Algorithm Design Manual》算法设计手册 红皮书 -*《算法导论》 是一本对算法介绍比较全面的经典书籍 +* 《算法设计与分析基础》 +* 《算法引论》 告诉你如何创造算法 断货 +* 《Algorithm Design Manual》算法设计手册 红皮书 +* 《算法导论》 是一本对算法介绍比较全面的经典书籍 -*《Algorithms on Strings,Trees and Sequences》 -*《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块 +* 《Algorithms on Strings,Trees and Sequences》 +* 《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块 ### 延伸阅读 -*《深入理解计算机系统》 -*《TCP/IP详解三卷》 -*《UNIX网络编程二卷》 -*《UNIX环境高级编程:第2版》 +* 《深入理解计算机系统》 +* 《TCP/IP详解三卷》 +* 《UNIX网络编程二卷》 +* 《UNIX环境高级编程:第2版》 -*《The practice of programming》 Brian Kernighan和Rob Pike -*《writing efficient programs》 优化 -*《The science of programming》 证明代码段的正确性 800块一本 +* 《The practice of programming》 Brian Kernighan和Rob Pike +* 《writing efficient programs》 优化 +* 《The science of programming》 证明代码段的正确性 800块一本 ## 参考链接和学习网站 ### [July 博客](http://blog.csdn.net/v_july_v) -《数学建模十大经典算法》 -《数据挖掘领域十大经典算法》 -《十道海量数据处理面试题》 -《数字图像处理领域的二十四个经典算法》 -《精选微软等公司经典的算法面试100题》 +* 《数学建模十大经典算法》 +* 《数据挖掘领域十大经典算法》 +* 《十道海量数据处理面试题》 +* 《数字图像处理领域的二十四个经典算法》 +* 《精选微软等公司经典的算法面试100题》 -[The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July) -[微软面试100题](http://blog.csdn.net/column/details/ms100.html) -[程序员编程艺术](http://blog.csdn.net/v_JULY_v/article/details/6460494) +* [The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July +* [微软面试100题](http://blog.csdn.net/column/details/ms100.html) +* [程序员编程艺术](http://blog.csdn.net/v_JULY_v/article/details/6460494) ### 基本算法演示 From 1a1f027147d652f3507ca4b1a20a2340ccfa3d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Wed, 12 Dec 2018 11:26:19 +0800 Subject: [PATCH 007/151] update readme --- README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/README.md b/README.md index 4e7b22e..61892a1 100644 --- a/README.md +++ b/README.md @@ -187,8 +187,7 @@ * 《算法设计与分析基础》 * 《算法引论》 告诉你如何创造算法 断货 * 《Algorithm Design Manual》算法设计手册 红皮书 -* 《算法导论》 是一本对算法介绍比较全面的经典书籍 - +* 《算法导论》 是一本对算法介绍比较全面的经典书籍 * 《Algorithms on Strings,Trees and Sequences》 * 《Advanced Data Structures》 各种诡异高级的数据结构和算法 如元胞自动机、斐波纳契堆、线段树 600块 @@ -199,8 +198,6 @@ * 《TCP/IP详解三卷》 * 《UNIX网络编程二卷》 * 《UNIX环境高级编程:第2版》 - - * 《The practice of programming》 Brian Kernighan和Rob Pike * 《writing efficient programs》 优化 * 《The science of programming》 证明代码段的正确性 800块一本 @@ -215,8 +212,6 @@ * 《十道海量数据处理面试题》 * 《数字图像处理领域的二十四个经典算法》 * 《精选微软等公司经典的算法面试100题》 - - * [The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July * [微软面试100题](http://blog.csdn.net/column/details/ms100.html) * [程序员编程艺术](http://blog.csdn.net/v_JULY_v/article/details/6460494) From 97357d8b6d6d2fbfeb354b8fc621670257612d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Wed, 12 Dec 2018 11:27:10 +0800 Subject: [PATCH 008/151] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61892a1..4987879 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ * 《十道海量数据处理面试题》 * 《数字图像处理领域的二十四个经典算法》 * 《精选微软等公司经典的算法面试100题》 -* [The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July +* [The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July) * [微软面试100题](http://blog.csdn.net/column/details/ms100.html) * [程序员编程艺术](http://blog.csdn.net/v_JULY_v/article/details/6460494) From 3ac27a7798ef5a85debfa522063ce880f6c884c0 Mon Sep 17 00:00:00 2001 From: purp1e <825739201@qq.com> Date: Fri, 12 Jul 2019 07:17:01 +0800 Subject: [PATCH 009/151] rename insert_srot.c to insert_sort.c --- Sort/{insert_srot.c => insert_sort.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Sort/{insert_srot.c => insert_sort.c} (100%) diff --git a/Sort/insert_srot.c b/Sort/insert_sort.c similarity index 100% rename from Sort/insert_srot.c rename to Sort/insert_sort.c From f547cca091540f1837bf76e89e2cf7723b25dfa4 Mon Sep 17 00:00:00 2001 From: purp1e <825739201@qq.com> Date: Fri, 12 Jul 2019 09:36:28 +0800 Subject: [PATCH 010/151] fix head_sort bug --- Sort/insert_sort.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/Sort/insert_sort.c b/Sort/insert_sort.c index c4e7098..d7dead9 100644 --- a/Sort/insert_sort.c +++ b/Sort/insert_sort.c @@ -136,30 +136,27 @@ void heap_swop(int *a,int *b){ //自顶向下调整 -void heap_public_adjust(int *a,int i,int length){ +void heap_public_adjust(int *a,int parent,int length){ // 三个数里取最大的一个 a[i],a[2i+1],a[2i+2],跟a[i]交换;然后是 a[(i-1)/2],a[i],a[i+1] .. 一直到a[0] - int tmp = i , max;// - while(2*tmp+1= a[max]) + if (a[parent] >= a[max])// parent > parent >= max(left, right) { break; } else { - heap_swop(&a[tmp],&a[max]); - tmp = 2*tmp+1; + heap_swop(&a[parent],&a[max]); + parent = max; //继续向下, 比对, 交换, 保证所有树 父节点 >= 子节点 + max = 2 * parent + 1; } } @@ -277,8 +274,8 @@ int main(){ start = clock(); - merge_sort(a,sizeof(a)/sizeof(int)); // 0.002s,可以看到,归并排序还是很快的 - //heap_sort(a,sizeof(a)/sizeof(int)); // 有buggggggg + //merge_sort(a,sizeof(a)/sizeof(int)); // 0.002s,可以看到,归并排序还是很快的 + heap_sort(a,sizeof(a)/sizeof(int)); // 有buggggggg //quicksort(a,0,sizeof(a)/sizeof(int)-1); // 0.01s //insert_sort(a,sizeof(a)/sizeof(int)); // 3.85s //select_sort(a,sizeof(a)/sizeof(int)); // 5.3s From 83f3b1760fe652f7c0d4345acbfb719dd3d541ef Mon Sep 17 00:00:00 2001 From: purp1e <825739201@qq.com> Date: Fri, 12 Jul 2019 09:51:14 +0800 Subject: [PATCH 011/151] Tab replace to four space --- Sort/insert_sort.c | 336 ++++++++++++++++++++++----------------------- 1 file changed, 168 insertions(+), 168 deletions(-) diff --git a/Sort/insert_sort.c b/Sort/insert_sort.c index d7dead9..f70a71e 100644 --- a/Sort/insert_sort.c +++ b/Sort/insert_sort.c @@ -6,19 +6,19 @@ // 插入排序 void insert_sort(int *a,int length){ - int tmp ; - int i,j; - for (i = 1; i < length; ++i) - { - - for ( tmp=a[i],j=i-1 ; j>=0 && a[j] > tmp ; j--) - { - a[j+1]=a[j]; - } - // j+1是插入的位置 - a[j+1]=tmp; - - } + int tmp ; + int i,j; + for (i = 1; i < length; ++i) + { + + for ( tmp=a[i],j=i-1 ; j>=0 && a[j] > tmp ; j--) + { + a[j+1]=a[j]; + } + // j+1是插入的位置 + a[j+1]=tmp; + + } } @@ -27,29 +27,29 @@ void insert_sort(int *a,int length){ void select_sort(int *a,int length){ - int min_index,tmp; - int j; - - for (int i = 0; i < length; ++i) - { - for (j = i+1 ,min_index=i; j < length; ++j)// 不能写成for (int j = i+1 ,min_index=i; j < length; ++j) - { - if (a[min_index]>a[j]) - { - min_index=j; - } - } - - //min_index是最小的元素的index - if (min_index!=i) - { - tmp=a[i]; - a[i]=a[min_index]; - a[min_index]=tmp; - - } - - } + int min_index,tmp; + int j; + + for (int i = 0; i < length; ++i) + { + for (j = i+1 ,min_index=i; j < length; ++j)// 不能写成for (int j = i+1 ,min_index=i; j < length; ++j) + { + if (a[min_index]>a[j]) + { + min_index=j; + } + } + + //min_index是最小的元素的index + if (min_index!=i) + { + tmp=a[i]; + a[i]=a[min_index]; + a[min_index]=tmp; + + } + + } } @@ -58,21 +58,21 @@ void select_sort(int *a,int length){ void bubble_sort(int *a, int length){ - int tmp ; + int tmp ; - for (int i = 0; i < length-1; ++i) // 第i轮排序 - { - for (int j = 0; j < length-i; ++j) - { - if (a[j] > a[j+1]) - { - tmp = a[j]; - a[j] = a[j+1]; - a[j+1] = tmp; - } - } + for (int i = 0; i < length-1; ++i) // 第i轮排序 + { + for (int j = 0; j < length-i; ++j) + { + if (a[j] > a[j+1]) + { + tmp = a[j]; + a[j] = a[j+1]; + a[j+1] = tmp; + } + } - } + } } @@ -82,45 +82,45 @@ void bubble_sort(int *a, int length){ // 挖坑填数,2边向中间扫描 int partion(int *a, int start,int end){ - int i=start,j=end; - int tmp = a[i]; // 这里要做越界检查 + int i=start,j=end; + int tmp = a[i]; // 这里要做越界检查 - while(i=tmp){ - j--; - } - if (i=tmp){ + j--; + } + if (i= a[max])// parent > parent >= max(left, right) - { - break; - } - else - { - heap_swop(&a[parent],&a[max]); + } + + // 和最大孩子比 + if (a[parent] >= a[max])// parent > parent >= max(left, right) + { + break; + } + else + { + heap_swop(&a[parent],&a[max]); parent = max; //继续向下, 比对, 交换, 保证所有树 父节点 >= 子节点 max = 2 * parent + 1; - } + } - } + } } @@ -168,35 +168,35 @@ void heap_public_adjust(int *a,int parent,int length){ //反之,把最小的孩子换上来就是创建最小堆 一直到a[0] void heap_build(int *a,int length){ - - for (int i = (length-2)/2; i >=0 ; --i) - { - // 三个数里取最大的一个 a[i],a[2i+1],a[2i+2],跟a[i]交换;然后是 a[(i-1)/2],a[i],a[i+1] .. 一直到a[0] - heap_public_adjust(a,i,length); - - } + + for (int i = (length-2)/2; i >=0 ; --i) + { + // 三个数里取最大的一个 a[i],a[2i+1],a[2i+2],跟a[i]交换;然后是 a[(i-1)/2],a[i],a[i+1] .. 一直到a[0] + heap_public_adjust(a,i,length); + + } } // 自顶向下调整 void heap_adjust(int *a,int length){ - heap_public_adjust(a,0,length); //对0号调整 + heap_public_adjust(a,0,length); //对0号调整 } void heap_sort(int *a, int length){ - // 建立堆 大根堆,递增排序 - heap_build(a,length); + // 建立堆 大根堆,递增排序 + heap_build(a,length); - for (int i = length-1; i >0; --i) - { - //交换 - heap_swop(&a[0],&a[i]); - //调整 - heap_adjust(a,i); - } + for (int i = length-1; i >0; --i) + { + //交换 + heap_swop(&a[0],&a[i]); + //调整 + heap_adjust(a,i); + } } @@ -208,31 +208,31 @@ void heap_sort(int *a, int length){ void merge_array(int *a,int size_a,int *b, int size_b){ - int *tmp = malloc( (size_a+size_b)*sizeof(int) ); - int i,j,k; - i=j=k=0; + int *tmp = malloc( (size_a+size_b)*sizeof(int) ); + int i,j,k; + i=j=k=0; - while(ib[j])?b[j++]:a[i++]; - } + tmp[k++] = (a[i]>b[j])?b[j++]:a[i++]; + } - while(i1) - { - - merge_sort(a,length/2); - merge_sort(a+length/2,length-length/2); + if (length>1) + { + + merge_sort(a,length/2); + merge_sort(a+length/2,length-length/2); - merge_array(a,length/2,a+length/2,length-length/2); - } + merge_array(a,length/2,a+length/2,length-length/2); + } @@ -261,35 +261,35 @@ void merge_sort(int *a, int length){ int main(){ - //int a[] = {4,87,2,32,5,2,9,49,49,23,45,2,41}; - //准备5000个数 - int a[Max_Number]; - for (int i = 0; i < Max_Number; ++i) - { - a[i]=rand()%Max_Number; - } - - clock_t start,finish; - - - - start = clock(); - //merge_sort(a,sizeof(a)/sizeof(int)); // 0.002s,可以看到,归并排序还是很快的 - heap_sort(a,sizeof(a)/sizeof(int)); // 有buggggggg - //quicksort(a,0,sizeof(a)/sizeof(int)-1); // 0.01s - //insert_sort(a,sizeof(a)/sizeof(int)); // 3.85s - //select_sort(a,sizeof(a)/sizeof(int)); // 5.3s - //bubble_sort(a,sizeof(a)/sizeof(int)); // 12.5s - finish = clock(); - - printf("after sort:\n"); - for (int i = 0; i < sizeof(a)/sizeof(int); ++i) - { - printf(" %d ",a[i]); - } - printf("time eclipse: %.6f sec\n", (double)(finish-start)/CLOCKS_PER_SEC); // CLOCKS_PER_SEC 1000 clock()是毫秒 - - return 0; + //int a[] = {4,87,2,32,5,2,9,49,49,23,45,2,41}; + //准备5000个数 + int a[Max_Number]; + for (int i = 0; i < Max_Number; ++i) + { + a[i]=rand()%Max_Number; + } + + clock_t start,finish; + + + + start = clock(); + //merge_sort(a,sizeof(a)/sizeof(int)); // 0.002s,可以看到,归并排序还是很快的 + heap_sort(a,sizeof(a)/sizeof(int)); // + //quicksort(a,0,sizeof(a)/sizeof(int)-1); // 0.01s + //insert_sort(a,sizeof(a)/sizeof(int)); // 3.85s + //select_sort(a,sizeof(a)/sizeof(int)); // 5.3s + //bubble_sort(a,sizeof(a)/sizeof(int)); // 12.5s + finish = clock(); + + printf("after sort:\n"); + for (int i = 0; i < sizeof(a)/sizeof(int); ++i) + { + printf(" %d ",a[i]); + } + printf("time eclipse: %.6f sec\n", (double)(finish-start)/CLOCKS_PER_SEC); // CLOCKS_PER_SEC 1000 clock()是毫秒 + + return 0; } From c600c42e13966580445da15be2d3f7681c8e8c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Mon, 12 Aug 2019 14:46:06 +0800 Subject: [PATCH 012/151] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ff43abe..c7c33e0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ * 把所有经典算法写一遍 * 看算法有关源码 -* 加入算法学习社区,相互鼓励学习 +* 加入算法学习社区,相互鼓励学习(加我vx:tiger-ran, 拉你入群) * 看经典书籍 * 刷题 From 7305a054442ef8acfcf30cd67c0ce1a5eb3f7244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Mon, 12 Aug 2019 14:46:44 +0800 Subject: [PATCH 013/151] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7c33e0..9c26fde 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ * 把所有经典算法写一遍 * 看算法有关源码 -* 加入算法学习社区,相互鼓励学习(加我vx:tiger-ran, 拉你入群) +* 加入算法学习社区,相互鼓励学习(加我vx:tiger-ran, 备注入群理由, 拉你入群) * 看经典书籍 * 刷题 From 7d85a451891cc116c98b61530ddcdaa6c6d0409c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Tue, 8 Oct 2019 20:24:01 +0800 Subject: [PATCH 014/151] rename Binary Tree to Tree --- Sort/README.md | 2 +- .../btree.c" | 0 .../btree/bintree.c" | 0 .../btree/btree" | Bin .../btree/public.h" | 0 .../btree/\351\230\237\345\210\227.h" | 0 .../rbtree.c" | 0 .../suffix_tree.c" | 0 .../BiSearchTree/README.md" | 0 .../BiSearchTree/bisearch" | Bin .../BiSearchTree/bisearchtree.c" | 0 .../BiSearchTree/bisearchtree.h" | 0 .../BiSearchTree/main.c" | 0 .../AVLTree.c" | 0 .../README.md" | 0 .../README.md" | 0 .../trie.c" | 0 .../heap.c" | 0 .../B\346\240\221.md" => "Tree/B\346\240\221.md" | 0 {Binary Tree => Tree}/README.md | 6 ++++-- ...\217\211\346\237\245\346\211\276\346\240\221.md" | 0 .../\344\274\270\345\261\225\346\240\221.md" | 0 .../\345\220\216\347\274\200\346\240\221.md" | 0 .../\345\255\227\345\205\270\346\240\221.md" | 0 ...\244\253\346\233\274\347\274\226\347\240\201.md" | 0 25 files changed, 5 insertions(+), 3 deletions(-) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" => "Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" => "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" => "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" => "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" => "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" => "Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" => "Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" (100%) rename "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" => "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" (100%) rename "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" => "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" (100%) rename "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" => "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" (100%) rename "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" => "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" (100%) rename "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" => "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" (100%) rename "Binary Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" => "Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" (100%) rename "Binary Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" => "Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" (100%) rename "Binary Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" => "Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" (100%) rename "Binary Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" => "Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" (100%) rename "Binary Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" => "Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" (100%) rename "Binary Tree/B\346\240\221.md" => "Tree/B\346\240\221.md" (100%) rename {Binary Tree => Tree}/README.md (86%) rename "Binary Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" => "Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" (100%) rename "Binary Tree/\344\274\270\345\261\225\346\240\221.md" => "Tree/\344\274\270\345\261\225\346\240\221.md" (100%) rename "Binary Tree/\345\220\216\347\274\200\346\240\221.md" => "Tree/\345\220\216\347\274\200\346\240\221.md" (100%) rename "Binary Tree/\345\255\227\345\205\270\346\240\221.md" => "Tree/\345\255\227\345\205\270\346\240\221.md" (100%) rename "Binary Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" => "Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" (100%) diff --git a/Sort/README.md b/Sort/README.md index 6ea2034..62d03a7 100644 --- a/Sort/README.md +++ b/Sort/README.md @@ -254,7 +254,7 @@ -###小结 +### 小结 常见的排序算法都是比较排序,比较排序的时间复杂度通常为 O(n^2) 或 O(nlogn) 但是如果带排序的数字有一些特俗性时,我们可以根据这来设计更加优化的排序算法。 diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" "b/Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" rename to "Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" diff --git "a/Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" "b/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" similarity index 100% rename from "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" rename to "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" diff --git "a/Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" "b/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" similarity index 100% rename from "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" rename to "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" diff --git "a/Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" "b/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" similarity index 100% rename from "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" rename to "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" diff --git "a/Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" "b/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" similarity index 100% rename from "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" rename to "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" diff --git "a/Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" "b/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" similarity index 100% rename from "Binary Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" rename to "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" diff --git "a/Binary Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" "b/Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" similarity index 100% rename from "Binary Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" rename to "Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" diff --git "a/Binary Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" "b/Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" similarity index 100% rename from "Binary Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" rename to "Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" diff --git "a/Binary Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" "b/Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" similarity index 100% rename from "Binary Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" rename to "Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" diff --git "a/Binary Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" "b/Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" similarity index 100% rename from "Binary Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" rename to "Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" diff --git "a/Binary Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" "b/Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" similarity index 100% rename from "Binary Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" rename to "Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" diff --git "a/Binary Tree/B\346\240\221.md" "b/Tree/B\346\240\221.md" similarity index 100% rename from "Binary Tree/B\346\240\221.md" rename to "Tree/B\346\240\221.md" diff --git a/Binary Tree/README.md b/Tree/README.md similarity index 86% rename from Binary Tree/README.md rename to Tree/README.md index 15d1a0b..96bd546 100644 --- a/Binary Tree/README.md +++ b/Tree/README.md @@ -1,13 +1,15 @@ +## 树🌲 + +介绍树相关的算法 + * 二叉查找树 * 赫夫曼编码 Huffman * 字典树trie(前缀树,单词查找树) * 伸展树 * 后缀树 - * AVL树 * 红黑树 - * B树 * B+树 mysql索引使用B+树的数据结构 * B*树 diff --git "a/Binary Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" similarity index 100% rename from "Binary Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" rename to "Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" diff --git "a/Binary Tree/\344\274\270\345\261\225\346\240\221.md" "b/Tree/\344\274\270\345\261\225\346\240\221.md" similarity index 100% rename from "Binary Tree/\344\274\270\345\261\225\346\240\221.md" rename to "Tree/\344\274\270\345\261\225\346\240\221.md" diff --git "a/Binary Tree/\345\220\216\347\274\200\346\240\221.md" "b/Tree/\345\220\216\347\274\200\346\240\221.md" similarity index 100% rename from "Binary Tree/\345\220\216\347\274\200\346\240\221.md" rename to "Tree/\345\220\216\347\274\200\346\240\221.md" diff --git "a/Binary Tree/\345\255\227\345\205\270\346\240\221.md" "b/Tree/\345\255\227\345\205\270\346\240\221.md" similarity index 100% rename from "Binary Tree/\345\255\227\345\205\270\346\240\221.md" rename to "Tree/\345\255\227\345\205\270\346\240\221.md" diff --git "a/Binary Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" similarity index 100% rename from "Binary Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" rename to "Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" From 5e335405e5e4ca0136cc2e37eaedd4b0b6536ac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Tue, 8 Oct 2019 20:40:34 +0800 Subject: [PATCH 015/151] inverted index --- ...47\264\242\345\274\225(Inverted Index).md" | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git "a/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" "b/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" index 1bf717b..f8d32a6 100644 --- "a/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" +++ "b/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" @@ -1,13 +1,44 @@ ## 倒排索引(Inverted Index) -也叫反向索引。是文档检索系统中最常用的数据结构。常规的索引是文档到关键词的映射,如果对应的文档是 +常规的索引是文档到关键词的映射,就是每个文档指向一个它所包含的索引项的序列,也就是文档文档指向了它包含的索引项序列,也就是文档指向它包含的哪些单词。 +倒排索引也叫反向索引。是文档检索系统中最常用的数据结构。被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。 +常被应用于搜索引擎和关键字查询的问题中。比如文档检索系统中,查询哪些文件包含了某个单词。 -[Elasticsearch](https://github.com/elastic/elasticsearch)就是使用倒排索引(inverted index)的结构来做快速的全文搜索。ElasticSearch 不仅用于全文搜索, 还有非常强大的统计功能 (facets)。 +而反向索引则是单词(关键词)指向包含了它的文档们。比如: -携程,58,美团的分享中都提到ES构建实时日志系统,帮助定位系统问题。 +``` +T0 = "it is what it is" +T1 = "what is it" +T2 = "it is a banana" +``` + +得到的反向文件索引是: + +``` +"a": {2} +"banana": {2} +"is": {0, 1, 2} +"it": {0, 1, 2} +"what": {0, 1} +``` + +当我们以”what” “is” “it”检索条件去查询时,结果集是: 。 +也就是结果集为文档0额文档1,但其实精确匹配的是文档1。 + + +### 数据结构 + +- 将文章提炼关键词,且每个关键词都对应这篇文章 +- 在加入新文章时,我们需要为新文章中的关键词索引和之前的合并 + + + +### 参考 + +[Elasticsearch](https://github.com/elastic/elasticsearch) 就是使用倒排索引(inverted index)的结构来做快速的全文搜索; ElasticSearch 不仅用于全文搜索, 还有非常强大的统计功能 (facets),携程,58,美团的分享中都提到ES构建实时日志系统,帮助定位系统问题。 [Elasticsearch权威指南](http://es.xiaoleilu.com/index.html) From e9716361242c28fb84d63ef809d75fa70ed98e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Tue, 8 Oct 2019 20:46:19 +0800 Subject: [PATCH 016/151] update inverted index --- ...22\346\216\222\347\264\242\345\274\225(Inverted Index).md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" "b/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" index f8d32a6..aed743c 100644 --- "a/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" +++ "b/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" @@ -25,8 +25,8 @@ T2 = "it is a banana" "what": {0, 1} ``` -当我们以”what” “is” “it”检索条件去查询时,结果集是: 。 -也就是结果集为文档0额文档1,但其实精确匹配的是文档1。 +当我们以”what” “is” “it”检索条件去查询时,结果集是:{0,1}∩{0,1,2}∩{0,1,2} = {0,1} 。 +也就是结果集为文档0和文档1,但其实精确匹配的是文档1。 ### 数据结构 From 2a687ed11f10bf074dc12ad1588831bd25a194f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Tue, 8 Oct 2019 21:00:25 +0800 Subject: [PATCH 017/151] update --- 15 Classic Algorithms/README.md | 6 ++++-- Algorithms Job Interview/README.md | 9 ++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/15 Classic Algorithms/README.md b/15 Classic Algorithms/README.md index 98ddba6..c580bf8 100644 --- a/15 Classic Algorithms/README.md +++ b/15 Classic Algorithms/README.md @@ -4,8 +4,6 @@ * A*寻路算法 :求解最短路径 * Dijkstra:最短路径算法 ->Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的 - * 动态规划 (Dynamic Programming) * BFS/DFS (广度/深度优先遍历) * 红黑树 一种自平衡的`二叉查找树` @@ -19,3 +17,7 @@ * SPFA(shortest path faster algorithm) 单元最短路径算法 * 快递选择SELECT + +### Dijkstra 最短路径算法 + +**Dijkstra** 是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的 diff --git a/Algorithms Job Interview/README.md b/Algorithms Job Interview/README.md index 59c02b8..21dbcb7 100644 --- a/Algorithms Job Interview/README.md +++ b/Algorithms Job Interview/README.md @@ -88,17 +88,16 @@ * 分布处理之Mapreduce -### 智力思维训练 +### 《剑指offer》 +《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 -###【剑指offer】 +### 《编程之美》 -《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 - +### 智力思维训练 -###【编程之美】 From 1b0827adfdcd4d3eb7bb9edb70bd210ffcf8ead9 Mon Sep 17 00:00:00 2001 From: Gilga <825739201@qq.com> Date: Thu, 17 Oct 2019 16:44:54 +0800 Subject: [PATCH 018/151] Fix git clone error --- .../1-\344\272\214\345\217\211\346\240\221/btree.c" | 0 .../btree/bintree.c" | 0 .../btree/btree" | Bin .../btree/public.h" | 0 .../btree/\351\230\237\345\210\227.h" | 0 .../rbtree.c" | 0 .../suffix_tree.c" | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/btree" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" (100%) rename "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" => "Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" (100%) diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/btree" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/btree" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" similarity index 100% rename from "Binary Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" rename to "Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" From dde4bb7a841f1c515265cbefce94e8215acbd68e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Thu, 17 Oct 2019 20:23:41 +0800 Subject: [PATCH 019/151] remove --- .../btree.c" | 31 -- .../btree/bintree.c" | 349 ------------------ .../btree/btree" | Bin 10336 -> 0 bytes .../btree/public.h" | 34 -- .../btree/\351\230\237\345\210\227.h" | 175 --------- .../rbtree.c" | 49 --- .../suffix_tree.c" | 34 -- 7 files changed, 672 deletions(-) delete mode 100644 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" delete mode 100644 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" delete mode 100755 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/btree" delete mode 100644 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" delete mode 100644 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" delete mode 100644 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" delete mode 100644 "Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" deleted file mode 100644 index fd00afe..0000000 --- "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree.c" +++ /dev/null @@ -1,31 +0,0 @@ -/* -### B树基础 - -B树即B-tree(B树就是B-tree),B是balanced,也就是平衡的意思。 - -B树又叫平衡多路查找树,节点的直接点个数可以多于2个,一颗m阶的B树: - -1) 树中每个节点做多含有m个子节点 -2) 根节点不是叶子节点,至少有2个孩子 -3) 所有叶子节点在同一层 -4) 除根节点和叶子节点外,每个分支节点至少有[m/2]个子树 -5) 有j个孩子的非叶子节点有 j-1 个关键码,关键码递增一次排列 - - -### B树应用 - -数据库 -文件系统 - - -### B树存储结构 - - - -### B树问题和延伸阅读 - - -*/ - - - diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" deleted file mode 100644 index 8297aa2..0000000 --- "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/bintree.c" +++ /dev/null @@ -1,349 +0,0 @@ -/** -* 第一次题目 :构建二叉树(链表存储方式),空格表示空树,实现二叉树的基本操作:创建,遍历(先,中,后,按层)二叉树 -* 提交邮箱 :510495266@qq.com to learn_algorithm@163.com -* 邮件题目 :第一期第一次作业 -**/ - -#include -#include - - -typedef struct BiTNode{ - - char item; - struct BiTNode *lChild,*rChild; - -}BiTNode,*BiTree; - - - - - -// ========================================================================== - - -#define OK 1 -#define ERROR 0 -typedef int bool; - - -typedef BiTree ElemType ; // 也可能是一个复杂的复合类型 -typedef int Status; - - - -//队列的顺序存储 -typedef struct Node{ - - ElemType *elem; - ElemType *head; - ElemType *tail; - int length; // 当前队列的长度 - int size; // 队列容器的长度,在队列慢得时候可以扩容 - - -}SqQueue; - -// -// 在队列采用顺序存储时,有一个毛病,就是队列操作一段时间后,头指针到了队列容器的尾部,而头指针前面的容器内存不可用了, -//造成内存极大的浪费,这个问题可以通过循环队列来解决。但是在 -// 链式队列上则不存在这样的问题 -// - - -typedef struct QNode{ - - struct QNode *next; - ElemType elem; - -}LinkQueue; - - -// 队列需要维护两个 指针 (队头指针,队尾指针) - -typedef struct{ - - LinkQueue *head; - LinkQueue *tail; - int length; - -}Queue; - - -Status initQueue(Queue *queue);// 带头结点,没有引用传值,就用指针的指针吧 -bool isEmpty(Queue *q); -int length(Queue *q); - - -// 在头部插入,尾部删除 -Status getHead(Queue *q,ElemType *e); -Status enQueue(Queue *q,ElemType e); -Status deQueue(Queue *q,ElemType *e); - -void traveser(Queue *q); - - -Status initQueue(Queue *queue){// 带头结点,没有引用传值,就用指针的指针吧 - - LinkQueue *lq = (LinkQueue *)malloc(sizeof(LinkQueue)); - if (!lq) { - return ERROR; - } - - lq->elem = NULL; - lq->next = NULL; - - (queue)->head = (queue)->tail = lq; // -> 优先级高于 * ,老老实实打上括号 - (queue)->length = 0; - - return OK; - -} - -bool isEmpty(Queue *q){ - - return (q->head == q->tail); - -} - -int length(Queue *q){ - -// int ret; -// LinkQueue *p = q->head; -// while (p != q->tail) { -// ret++; -// p = p->next; -// -// } - - return q->length; - -} - -Status getHead(Queue *q,ElemType *e){ - - LinkQueue *p = q->head->next; - if (!p) { - *e=NULL; - return ERROR; - } - - *e = p->elem; - return OK; - -} - -// 入队(加入到队尾) -Status enQueue(Queue *q,ElemType e){ - - LinkQueue *newNode = (LinkQueue *)malloc(sizeof(LinkQueue)); - if (!newNode) { - return ERROR; - } - newNode->elem = e; - newNode->next = NULL; - q->tail->next = newNode; - q->tail = newNode; - - q->length++; - - return OK; - -} - -//出队(队头). 注意,可能只有1个元素,造成队尾指针丢失 -Status deQueue(Queue *q,ElemType *e){ - - LinkQueue *p = q->head->next; - if (!p) {// 队列空 - return ERROR; - } - - if (e) { - *e = p->elem ; - } - - LinkQueue *temp = p->next; - q->head->next = temp; - if (p == q->tail) { - q->tail = q->head; - } - free(p); - - - q->length--; - - return OK; - -} - - -void traveser(Queue *q){ - - LinkQueue *p = q->head->next; - while (NULL != p) { - //printf("%d\n",p->elem); - p=p->next; - } - -} - - -// ================================================== - - - -/* -int CreateBiTree(BiTree *T) -{ - - *T = (BiTNode *)malloc(sizeof(BiTNode)); - if (*T==NULL) - { - printf("memery malloc failure !\n"); - return -1; - } - - printf("enter data to create node:\n"); - scanf("%c",&((*T)->item)); - if((*T)->item=='#'){ - *T=NULL; - } - if(*T){ - printf("创建左子树:\n"); - CreateBiTree( &((*T)->lChild) ); - printf("创建右子树:\n"); - CreateBiTree( &((*T)->rChild) ); - } - - return 0; -} -*/ - -// BiTree CreateBiTree() - -// 先序遍历方式创建二叉树 -BiTree CreateBiTree(){ - - char c; - BiTNode *tree; - - // 过滤回车键 - - - scanf("%c",&c); - if (c==' ') - { - printf("创建空节点\n"); - tree = NULL; - }else{ - printf("创建节点 %c\n",c); - tree = (BiTNode *)malloc(sizeof(BiTNode)); - tree->item = c; - tree->lChild = CreateBiTree(); - tree->rChild = CreateBiTree(); - } - - return tree; - -} - - -int PreOrderTraverse(BiTree T){ - - if(T){ - printf("%c\n",T->item ); - PreOrderTraverse(T->lChild); - PreOrderTraverse(T->rChild); - } - - return 0; -} - -int InOrderTraverse(BiTree T){ - - if (T) - { - InOrderTraverse(T->lChild); - printf("%c\n", T->item); - InOrderTraverse(T->rChild); - } - - return 0; -} - -int PostOrderTraverse(BiTree T){ - - if (T) - { - PostOrderTraverse(T->lChild); - PostOrderTraverse(T->rChild); - printf("%c\n",T->item ); - } - - return 0; -} - -// 广度优先遍历 (队列实现) -int LevelOrderTraverse(BiTree T){ - - if (T) - { - Queue queue; - initQueue(&queue); - - BiTree u; - u=(BiTree)malloc(sizeof(BiTNode)); - enQueue(&queue, T); - while(!isEmpty(&queue)) - { - deQueue(&queue, &u); - printf("%c",u->item); - if(u->lChild) - enQueue(&queue, u->lChild); - if(u->rChild) - enQueue(&queue, u->rChild); - } - } - - return 0; -} - - - - int main(int argc, char const *argv[]) -{ - /* code */ - BiTree binaryTree; - - printf("创建二叉树,输入\"空格\"创建空节点(先序方式建立二叉树):\n"); - binaryTree = CreateBiTree(); - if(binaryTree==NULL){ - printf("创建空的二叉树\n"); - } - - - printf("前序遍历:\n"); - PreOrderTraverse(binaryTree); - printf("\n\n"); - - printf("中序遍历:\n"); - InOrderTraverse(binaryTree); - printf("\n\n"); - - printf("后序遍历:\n"); - PostOrderTraverse(binaryTree); - printf("\n\n"); - - printf("层序遍历:\n"); - LevelOrderTraverse(binaryTree); - printf("\n\n"); - - - return 0; -} - - - - - diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/btree" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/btree" deleted file mode 100755 index 2ab2e85980bbdc3ffb20c6fe5d5389d6526e6716..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10336 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 Zjk4qhnoEfMG@w5R=uZIZ?4R)=;y=lI8lwOJ diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" deleted file mode 100644 index 27b6d1f..0000000 --- "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/public.h" +++ /dev/null @@ -1,34 +0,0 @@ -// -// public.h -// DS -// -// Created by mac on 13-9-8. -// Copyright (c) 2013年 xiaoran. All rights reserved. -// - -#ifndef DS_public_h -#define DS_public_h - -//#include -#include "stdlib.h" // 后来,换到mac环境下,#include 应该为 或 #include "stdlib.h" -#include -#include // for memset - - -typedef char ElemType ; // 也可能是一个复杂的复合类型 -typedef int Status; - - - -#define OK 1 -#define ERROR 0 - -typedef int bool; -#define YES 1 -#define NO 0 - -#define DEFAULT_SIZE 10 -#define OUT_OF_BOUND -1 - - -#endif diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" deleted file mode 100644 index 220ae46..0000000 --- "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/btree/\351\230\237\345\210\227.h" +++ /dev/null @@ -1,175 +0,0 @@ -// -// 队列.h -// 只在一段进行插入,另一端删除元素 -// -// Created by mac on 13-9-8. -// Copyright (c) 2013年 xiaoran. All rights reserved. -// - -#ifndef DS____h -#define DS____h - -#include "public.h" -#include "bintree.c" - -typedef BiTNode ElemType; - -//队列的顺序存储 -typedef struct Node{ - - ElemType *elem; - ElemType *head; - ElemType *tail; - int length; // 当前队列的长度 - int size; // 队列容器的长度,在队列慢得时候可以扩容 - - -}SqQueue; - -// -// 在队列采用顺序存储时,有一个毛病,就是队列操作一段时间后,头指针到了队列容器的尾部,而头指针前面的容器内存不可用了, -//造成内存极大的浪费,这个问题可以通过循环队列来解决。但是在 -// 链式队列上则不存在这样的问题 -// - - -typedef struct QNode{ - - struct QNode *next; - ElemType elem; - -}LinkQueue; - - -// 队列需要维护两个 指针 (队头指针,队尾指针) - -typedef struct{ - - LinkQueue *head; - LinkQueue *tail; - int length; - -}Queue; - - -Status initQueue(Queue *queue);// 带头结点,没有引用传值,就用指针的指针吧 -bool isEmpty(Queue *q); -int length(Queue *q); - - -// 在头部插入,尾部删除 -Status getHead(Queue *q,ElemType *e); -Status enQueue(Queue *q,ElemType e); -Status deQueue(Queue *q,ElemType *e); - -void traveser(Queue *q); - - -Status initQueue(Queue *queue){// 带头结点,没有引用传值,就用指针的指针吧 - - LinkQueue *lq = (LinkQueue *)malloc(sizeof(LinkQueue)); - if (!lq) { - return ERROR; - } - - lq->elem = 0; - lq->next = NULL; - - (queue)->head = (queue)->tail = lq; // -> 优先级高于 * ,老老实实打上括号 - (queue)->length = 0; - - return OK; - -} - -bool isEmpty(Queue *q){ - - return (q->head == q->tail); - -} - -int length(Queue *q){ - -// int ret; -// LinkQueue *p = q->head; -// while (p != q->tail) { -// ret++; -// p = p->next; -// -// } - - return q->length; - -} - -Status getHead(Queue *q,ElemType *e){ - - LinkQueue *p = q->head->next; - if (!p) { - *e=0; - return ERROR; - } - - *e = p->elem; - return OK; - -} - -// 入队(加入到队尾) -Status enQueue(Queue *q,ElemType e){ - - LinkQueue *newNode = (LinkQueue *)malloc(sizeof(LinkQueue)); - if (!newNode) { - return ERROR; - } - newNode->elem = e; - newNode->next = NULL; - q->tail->next = newNode; - q->tail = newNode; - - q->length++; - - return OK; - -} - -//出队(队头). 注意,可能只有1个元素,造成队尾指针丢失 -Status deQueue(Queue *q,ElemType *e){ - - LinkQueue *p = q->head->next; - if (!p) {// 队列空 - return ERROR; - } - - if (e) { - *e = p->elem ; - } - - LinkQueue *temp = p->next; - q->head->next = temp; - if (p == q->tail) { - q->tail = q->head; - } - free(p); - - - q->length--; - - return OK; - -} - - -void traveser(Queue *q){ - - LinkQueue *p = q->head->next; - while (NULL != p) { - printf("%d\n",p->elem); - p=p->next; - } - -} - - - -#endif diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" deleted file mode 100644 index 6e276f7..0000000 --- "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/rbtree.c" +++ /dev/null @@ -1,49 +0,0 @@ -/* -### 红黑树基础 - -一种自平衡的二叉查找树。在每个节点中增加一个存储位表示节点的颜色,可以是red或black - -红黑树比AVL树优秀在哪? - - - - - -5个性质 - -性质1. 节点是红色或黑色。 -性质2. 根是黑色。 -性质3. 所有叶子都是黑色(叶子是NIL节点)。 -性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) -性质5. 从任一节点到其每个叶子的所有简单路径 都包含相同数目的黑色节点。 - - - -### 红黑树应用 - - -### 存储结构 - - -### 问题与延伸阅读 - - -*/ - -typedef int ElemType - -typedef struct node{ - - int color; - ElemType key; - struct node *lChild,*rChild,*pChild; - -}*RBTree; - - -int rbtree_insert(RBTree *tree,ElemType key); -int rbtree_remove(RBTree *tree,ElemType key); -int rbtree_search(RBTree *tree,ElemType key); - - - diff --git "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" "b/Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" deleted file mode 100644 index 67b05c3..0000000 --- "a/Binary Tree/1-\344\272\214\345\217\211\346\240\221/suffix_tree.c" +++ /dev/null @@ -1,34 +0,0 @@ -/* - -### 后缀树(suffix tree)基础 - -又叫后缀trie,与trie最大不同在于:字符串集合由指定的后缀子串组成。 - - -很适合用来操作字符串的子串。 用于字符串的匹配和查询 - - -### 后缀树应用 - - - 从目标串T中判断是否包含模式串P(时间复杂度接近KMP算法); - 从目标串T中查找最长的重复子串; - 从目标串T1和T2中查找最长公共子串; - Ziv-Lampel无损压缩算法; - 从目标串T中查找最长的回文子串; - - - -### 存储结构 - - -### suffix tree 问题与延伸阅读 - -后缀数组 - - -*/ - - - - From 27c3c9cd3173a8cbc4d011d86c6addf5cc973107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Tue, 14 Jan 2020 22:27:44 +0800 Subject: [PATCH 020/151] Create LICENSE --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From 69f98a081cb15f2b302e8210553213955b151c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= Date: Thu, 28 May 2020 18:00:46 +0800 Subject: [PATCH 021/151] update readme --- {Graph Algorithms => Graph}/README.md | 0 README.md | 4 ++-- {Search Algorithms => Search}/README.md | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename {Graph Algorithms => Graph}/README.md (100%) rename {Search Algorithms => Search}/README.md (100%) diff --git a/Graph Algorithms/README.md b/Graph/README.md similarity index 100% rename from Graph Algorithms/README.md rename to Graph/README.md diff --git a/README.md b/README.md index 9c26fde..06bd396 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ * 数据压缩 -### 二叉树 +### 树 * 二叉树 * 二叉查找树 @@ -136,7 +136,7 @@ * 分治算法 -## 算法问题选编 +## 算法题目选编 这是一个算法题目合集,题目是我从网络和书籍之中整理而来,部分题目已经做了思路整理。问题分类包括: diff --git a/Search Algorithms/README.md b/Search/README.md similarity index 100% rename from Search Algorithms/README.md rename to Search/README.md From 517f05b8281afbfaa64027d8cdea84bfe775d987 Mon Sep 17 00:00:00 2001 From: Alok54 <62331914+Alok54@users.noreply.github.com> Date: Sun, 11 Oct 2020 16:05:30 +0530 Subject: [PATCH 022/151] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 87513ea..2ca7752 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.dat *.txt *ipslice* +*.log From aa5daa94a59db8be0b53b78a0dea3f969da4da6f Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 18 Mar 2021 21:06:06 +0800 Subject: [PATCH 023/151] rename --- {Link Table => Link List}/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {Link Table => Link List}/README.md (100%) diff --git a/Link Table/README.md b/Link List/README.md similarity index 100% rename from Link Table/README.md rename to Link List/README.md From 72732a6eb74d31b88b7d4b226dac8323e86870a1 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 18 Mar 2021 21:11:27 +0800 Subject: [PATCH 024/151] update hashmap --- Hash Table/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Hash Table/README.md b/Hash Table/README.md index 0051a7c..660e04e 100644 --- a/Hash Table/README.md +++ b/Hash Table/README.md @@ -8,6 +8,7 @@ * 散列函数设计 * 冲突处理 * hashmap数据结构 +* Java 中HashMap实现 散列表使用某种算法操作(散列函数)将键转化为数组的索引来访问数组中的数据,这样可以通过Key-value的方式来访问数据,达到常数级别的存取效率。现在的nosql数据库都是采用key-value的方式来访问存储数据。 @@ -204,6 +205,12 @@ HashMap *_putInList(HashMap *hashMap,int index,Key key,Value value){ 3. hash表在海量数据处理中有广泛应用。如海量日志中,提取出某日访问百度次数最多的IP +## Java 中HashMap实现 + +编程语言中HashMap是如何实现的呢? 说说 Java , Golang + + + ## 参考 《Algorithms》 From 09d8a6131e8b0ef03a442ccd3f4cf8bcf5c49923 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 18 Mar 2021 21:12:29 +0800 Subject: [PATCH 025/151] update tree --- ...44\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" | 0 .../\345\255\227\345\205\270\346\240\221.md" | 0 .../\344\274\270\345\261\225\346\240\221.md" | 0 .../\345\220\216\347\274\200\346\240\221.md" | 0 .../B\346\240\221.md" => "Tree/7-B\346\225\260/B\346\240\221.md" | 0 ...50\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename "Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" => "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" (100%) rename "Tree/\345\255\227\345\205\270\346\240\221.md" => "Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" (100%) rename "Tree/\344\274\270\345\261\225\346\240\221.md" => "Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" (100%) rename "Tree/\345\220\216\347\274\200\346\240\221.md" => "Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" (100%) rename "Tree/B\346\240\221.md" => "Tree/7-B\346\225\260/B\346\240\221.md" (100%) rename "Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" => "Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" (100%) diff --git "a/Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" similarity index 100% rename from "Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" rename to "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" diff --git "a/Tree/\345\255\227\345\205\270\346\240\221.md" "b/Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" similarity index 100% rename from "Tree/\345\255\227\345\205\270\346\240\221.md" rename to "Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" diff --git "a/Tree/\344\274\270\345\261\225\346\240\221.md" "b/Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" similarity index 100% rename from "Tree/\344\274\270\345\261\225\346\240\221.md" rename to "Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" diff --git "a/Tree/\345\220\216\347\274\200\346\240\221.md" "b/Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" similarity index 100% rename from "Tree/\345\220\216\347\274\200\346\240\221.md" rename to "Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" diff --git "a/Tree/B\346\240\221.md" "b/Tree/7-B\346\225\260/B\346\240\221.md" similarity index 100% rename from "Tree/B\346\240\221.md" rename to "Tree/7-B\346\225\260/B\346\240\221.md" diff --git "a/Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" similarity index 100% rename from "Tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" rename to "Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" From dcce9f67eb3d62b3c702594dc216cddd9b815cb6 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 18 Mar 2021 21:24:06 +0800 Subject: [PATCH 026/151] rename dir --- {String => 1 String}/README.md | 0 {Link List => 2 Link List}/README.md | 0 {Hash Table => 3 Hash Table}/HashTable.c | 0 {Hash Table => 3 Hash Table}/README.md | 0 {Hash Table => 3 Hash Table}/hash_ref.c | 0 {Hash Table => 3 Hash Table}/hashmap.png | Bin .../btree.c" | 0 .../btree/bintree.c" | 0 .../btree/btree" | Bin .../btree/public.h" | 0 .../btree/\351\230\237\345\210\227.h" | 0 .../rbtree.c" | 0 .../suffix_tree.c" | 0 .../BiSearchTree/README.md" | 0 .../BiSearchTree/bisearch" | Bin .../BiSearchTree/bisearchtree.c" | 0 .../BiSearchTree/bisearchtree.h" | 0 .../BiSearchTree/main.c" | 0 ...11\346\237\245\346\211\276\346\240\221.md" | 0 .../AVLTree.c" | 0 .../README.md" | 0 .../README.md" | 0 .../trie.c" | 0 .../\345\255\227\345\205\270\346\240\221.md" | 0 .../\344\274\270\345\261\225\346\240\221.md" | 0 .../\345\220\216\347\274\200\346\240\221.md" | 0 .../7-B\346\225\260/B\346\240\221.md" | 0 .../heap.c" | 0 {Tree => 4 Tree}/README.md | 0 ...53\346\233\274\347\274\226\347\240\201.md" | 0 ...11\346\237\245\346\211\276\346\240\221.md" | 109 ++++++++++++++++++ {Graph => 5 Graph}/README.md | 3 + {Sort => 6 Sort}/8.c | 0 {Sort => 6 Sort}/README.md | 0 {Sort => 6 Sort}/bubblesort.gif | Bin {Sort => 6 Sort}/heapsort.gif | Bin {Sort => 6 Sort}/insert_sort.c | 0 {Sort => 6 Sort}/mergesort.gif | Bin {Sort => 6 Sort}/qsort.gif | Bin {Sort => 6 Sort}/selectsort.gif | Bin {Sort => 6 Sort}/shellsort.gif | Bin {Search => 7 Search}/README.md | 0 .../README.md | 0 ...06\346\262\273\347\256\227\346\263\225.md" | 0 ...50\346\200\201\350\247\204\345\210\222.md" | 0 .../\345\233\236\346\272\257\346\263\225.md" | 0 ...76\346\220\234\347\264\242\346\263\225.md" | 0 ...52\345\277\203\347\256\227\346\263\225.md" | 0 .../\350\277\255\344\273\243\346\263\225.md" | 0 .../\351\200\222\345\275\222.md" | 0 .../README.md | 0 .../leetcode.md | 0 .../\344\271\235\345\272\246OJ.md" | 0 .../\344\272\214\345\217\211\346\240\221.md" | 0 .../\345\211\221\346\214\207offer/README.md" | 0 .../\345\233\276.md" | 0 .../\345\240\206\345\222\214\346\240\210.md" | 0 .../\345\255\227\347\254\246\344\270\262.md" | 0 ...60\345\200\274\351\227\256\351\242\230.md" | 0 ...60\345\210\227\351\227\256\351\242\230.md" | 0 ...35\347\273\264\350\256\255\347\273\203.md" | 0 .../1.c" | 0 .../10.c" | 0 .../11.c" | 0 .../12.c" | 0 .../2.c" | 0 .../20.c" | 0 .../21.c" | 0 .../22.c" | 0 .../23.c" | 0 .../24.c" | 0 .../25.c" | 0 .../26.c" | 0 .../27.c" | 0 .../28.c" | 0 .../3.c" | 0 .../4-1.c" | 0 .../5.c" | 0 .../6.c" | 0 .../7.c" | 0 .../8.c" | 0 .../9.c" | 0 .../Power.c" | 0 .../bt1.c" | 0 .../c1.c" | 0 .../c10.c" | 0 .../c11-2.c" | 0 .../c11.c" | 0 .../c12.c" | 0 .../c13-1.c" | 0 .../c13-2.c" | 0 .../c14.c" | 0 .../c15.c" | 0 .../c16.c" | 0 .../c17.c" | 0 .../c18.c" | 0 .../c19.c" | 0 .../c2.c" | 0 .../c20.c" | 0 .../c3.c" | 0 .../c4.c" | 0 .../c5.c" | 0 .../c6.c" | 0 .../c7.c" | 0 .../c8.c" | 0 .../c9.c" | 0 .../char_first_appear_once.c" | 0 .../delete_occurence_character.c" | 0 .../fibonacci.c" | 0 .../longest_continuious_number.c" | 0 .../most_visit_ip.c" | 0 .../one_appear_count_by_binary.c" | 0 .../print_matrix.c" | 0 .../proc.c" | 0 .../replce_blank.c" | 0 .../revert_by_word.c" | 0 .../string.c" | 0 ...60\346\215\256\345\244\204\347\220\206.md" | 0 .../\347\237\251\351\230\265.md" | 0 ...73\347\273\237\350\256\276\350\256\241.md" | 0 .../README.md" | 0 .../\351\223\276\350\241\250.md" | 0 .../Bitmap.md | 0 ...6\350\277\207\346\273\244\345\231\250).md" | 0 ...06\350\200\214\346\262\273\344\271\213.md" | 0 .../README.md | 0 .../btree_insert.gif | Bin .../disk_search.png | Bin .../simhash\347\256\227\346\263\225.md" | 0 ...47\264\242\345\274\225(Inverted Index).md" | 0 ...4\204\347\220\206\344\271\213Mapreduce.md" | 0 ...02\346\241\266\345\210\222\345\210\206.md" | 0 .../\345\244\226\346\216\222\345\272\217.md" | 0 ...56\345\272\223\347\264\242\345\274\225.md" | 0 .../README.md | 0 .../README.md | 0 .../YYCache.md | 0 .../README.md | 0 138 files changed, 112 insertions(+) rename {String => 1 String}/README.md (100%) rename {Link List => 2 Link List}/README.md (100%) rename {Hash Table => 3 Hash Table}/HashTable.c (100%) rename {Hash Table => 3 Hash Table}/README.md (100%) rename {Hash Table => 3 Hash Table}/hash_ref.c (100%) rename {Hash Table => 3 Hash Table}/hashmap.png (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" (100%) rename "Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" => "4 Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" (100%) rename "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" => "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" (100%) rename "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" => "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" (100%) rename "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" => "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" (100%) rename "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" => "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" (100%) rename "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" => "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" (100%) rename "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" => "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" (100%) rename "Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" => "4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" (100%) rename "Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" => "4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" (100%) rename "Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" => "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" (100%) rename "Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" => "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" (100%) rename "Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" => "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" (100%) rename "Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" => "4 Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" (100%) rename "Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" => "4 Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" (100%) rename "Tree/7-B\346\225\260/B\346\240\221.md" => "4 Tree/7-B\346\225\260/B\346\240\221.md" (100%) rename "Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" => "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" (100%) rename {Tree => 4 Tree}/README.md (100%) rename "Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" => "4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" (100%) create mode 100644 "4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" rename {Graph => 5 Graph}/README.md (83%) rename {Sort => 6 Sort}/8.c (100%) rename {Sort => 6 Sort}/README.md (100%) rename {Sort => 6 Sort}/bubblesort.gif (100%) rename {Sort => 6 Sort}/heapsort.gif (100%) rename {Sort => 6 Sort}/insert_sort.c (100%) rename {Sort => 6 Sort}/mergesort.gif (100%) rename {Sort => 6 Sort}/qsort.gif (100%) rename {Sort => 6 Sort}/selectsort.gif (100%) rename {Sort => 6 Sort}/shellsort.gif (100%) rename {Search => 7 Search}/README.md (100%) rename {Algorithms Analysis => 8 Algorithms Analysis}/README.md (100%) rename "Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" => "8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" (100%) rename "Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" => "8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" (100%) rename "Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" => "8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" (100%) rename "Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" => "8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" (100%) rename "Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" => "8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" (100%) rename "Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" => "8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" (100%) rename "Algorithms Analysis/\351\200\222\345\275\222.md" => "8 Algorithms Analysis/\351\200\222\345\275\222.md" (100%) rename {Algorithms Job Interview => 9 Algorithms Job Interview}/README.md (100%) rename {Algorithms Job Interview => 9 Algorithms Job Interview}/leetcode.md (100%) rename "Algorithms Job Interview/\344\271\235\345\272\246OJ.md" => "9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" (100%) rename "Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" => "9 Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" (100%) rename "Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" => "9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" (100%) rename "Algorithms Job Interview/\345\233\276.md" => "9 Algorithms Job Interview/\345\233\276.md" (100%) rename "Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" => "9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" (100%) rename "Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" => "9 Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" (100%) rename "Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" => "9 Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" (100%) rename "Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" => "9 Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" (100%) rename "Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" => "9 Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" (100%) rename "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" (100%) rename "Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" => "9 Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" (100%) rename "Algorithms Job Interview/\347\237\251\351\230\265.md" => "9 Algorithms Job Interview/\347\237\251\351\230\265.md" (100%) rename "Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" => "9 Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" (100%) rename "Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" => "9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" (100%) rename "Algorithms Job Interview/\351\223\276\350\241\250.md" => "9 Algorithms Job Interview/\351\223\276\350\241\250.md" (100%) rename {Algorithms In Big Data => 91 Algorithms In Big Data}/Bitmap.md (100%) rename "Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" => "91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" (100%) rename "Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" => "91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" (100%) rename {Algorithms In Big Data => 91 Algorithms In Big Data}/README.md (100%) rename {Algorithms In Big Data => 91 Algorithms In Big Data}/btree_insert.gif (100%) rename {Algorithms In Big Data => 91 Algorithms In Big Data}/disk_search.png (100%) rename "Algorithms In Big Data/simhash\347\256\227\346\263\225.md" => "91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" (100%) rename "Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" => "91 Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" (100%) rename "Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" => "91 Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" (100%) rename "Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" => "91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" (100%) rename "Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" => "91 Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" (100%) rename "Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" => "91 Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" (100%) rename {Algorithms In DB => 92 Algorithms In DB}/README.md (100%) rename {Algorithms In Open Source => 93 Algorithms In Open Source}/README.md (100%) rename {Algorithms In Open Source => 93 Algorithms In Open Source}/YYCache.md (100%) rename {15 Classic Algorithms => 94 15-Classic-Algorithms}/README.md (100%) diff --git a/String/README.md b/1 String/README.md similarity index 100% rename from String/README.md rename to 1 String/README.md diff --git a/Link List/README.md b/2 Link List/README.md similarity index 100% rename from Link List/README.md rename to 2 Link List/README.md diff --git a/Hash Table/HashTable.c b/3 Hash Table/HashTable.c similarity index 100% rename from Hash Table/HashTable.c rename to 3 Hash Table/HashTable.c diff --git a/Hash Table/README.md b/3 Hash Table/README.md similarity index 100% rename from Hash Table/README.md rename to 3 Hash Table/README.md diff --git a/Hash Table/hash_ref.c b/3 Hash Table/hash_ref.c similarity index 100% rename from Hash Table/hash_ref.c rename to 3 Hash Table/hash_ref.c diff --git a/Hash Table/hashmap.png b/3 Hash Table/hashmap.png similarity index 100% rename from Hash Table/hashmap.png rename to 3 Hash Table/hashmap.png diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree.c" diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/bintree.c" diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/btree" diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/public.h" diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /btree/\351\230\237\345\210\227.h" diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /rbtree.c" diff --git "a/Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" "b/4 Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" similarity index 100% rename from "Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" rename to "4 Tree/1-\344\272\214\345\217\211\346\240\221 /suffix_tree.c" diff --git "a/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" similarity index 100% rename from "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" rename to "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/README.md" diff --git "a/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" similarity index 100% rename from "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" rename to "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearch" diff --git "a/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" similarity index 100% rename from "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" rename to "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.c" diff --git "a/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" similarity index 100% rename from "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" rename to "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/bisearchtree.h" diff --git "a/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" similarity index 100% rename from "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" rename to "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/BiSearchTree/main.c" diff --git "a/Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" similarity index 100% rename from "Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" rename to "4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" diff --git "a/Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" similarity index 100% rename from "Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" rename to "4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" diff --git "a/Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" similarity index 100% rename from "Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" rename to "4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" diff --git "a/Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" similarity index 100% rename from "Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" rename to "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" diff --git "a/Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" similarity index 100% rename from "Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" rename to "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/trie.c" diff --git "a/Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" similarity index 100% rename from "Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" rename to "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" diff --git "a/Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" "b/4 Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" similarity index 100% rename from "Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" rename to "4 Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" diff --git "a/Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" "b/4 Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" similarity index 100% rename from "Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" rename to "4 Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" diff --git "a/Tree/7-B\346\225\260/B\346\240\221.md" "b/4 Tree/7-B\346\225\260/B\346\240\221.md" similarity index 100% rename from "Tree/7-B\346\225\260/B\346\240\221.md" rename to "4 Tree/7-B\346\225\260/B\346\240\221.md" diff --git "a/Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" "b/4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" similarity index 100% rename from "Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" rename to "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" diff --git a/Tree/README.md b/4 Tree/README.md similarity index 100% rename from Tree/README.md rename to 4 Tree/README.md diff --git "a/Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" similarity index 100% rename from "Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" rename to "4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" diff --git "a/4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" new file mode 100644 index 0000000..6e23115 --- /dev/null +++ "b/4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" @@ -0,0 +1,109 @@ + +## 二叉查找树 + +二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。是指一个空树或者具有下列性质的二叉树: + + 1. 若任意节点的左子树不为空,则左子树上所有的节点值小于它的根节点值 + 2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值 + 3. 任意节点左右子树也为二叉查找树 + 4. 没有键值相等的节点 + + ``` + typedef int ElemType; + typedef struct BiSearchTree{ + ElemType key; + struct BiSearchTree *lChild; + struct BiSearchTree *rChild; + }BiSearchTree; + BiSearchTree *bisearch_tree_insert(BiSearchTree *tree,ElemType node); + int bisearch_tree_delete(BiSearchTree **tree,ElemType node); + int bisearch_tree_search(BiSearchTree *tree,ElemType node); + ``` + + +删除节点,需要重建排序树 + + 1) 删除节点是叶子节点(分支为0),结构不破坏 + 2)删除节点只有一个分支(分支为1),结构也不破坏 + 3)删除节点有2个分支,此时删除节点 + +思路一: 选左子树的最大节点,或右子树最小节点替换 + +``` +int bisearch_tree_delete(BiSearchTree **tree,ElemType node){ + + if (NULL==tree) { + return -1; + } + // 查找删除目标节点 + BiSearchTree *target=*tree,*parent=NULL; + while (NULL!=target) { + if (nodekey) { + parent=target; + target=target->lChild; + }else if(node==target->key){ + break; + }else{ + parent=target; + target=target->rChild; + } + } + + if (NULL==target) { + printf("树为空,或想要删除的节点不存在\n"); + return -1; + } + //该节点为叶子节点,直接删除 + if (!target->rChild && !target->lChild) + { + if (NULL==parent) {////只有一个节点的二叉查找树 + *tree=NULL; + }else{ + if (target->key>parent->key) { + parent->rChild=NULL; + }else{ + parent->lChild=NULL; + } + + } + free(target);//父节点处理,不然野指针,造成崩溃 + } + + else if(!target->rChild){ //右子树空则只需重接它的左子树,用左子树替换掉当前要删除的节点 + BiSearchTree *del=target->lChild; + target->key = target->lChild->key; + target->lChild=target->lChild->lChild; + target->rChild=target->lChild->rChild; + + free(del); + } + else if(!target->lChild){ //左子树空只需重接它的右子树 + BiSearchTree *del=target->rChild; + target->key = target->rChild->key; + target->lChild=target->rChild->lChild; + target->rChild=target->rChild->rChild; + + free(del); + } + else{ //左右子树均不空,p,t 2个指针一前以后,将左子树最大的节点(肯定是一个最右的节点)替换到删除的节点后,还需要处理左子树最大节点的左子树 + + BiSearchTree *p=target,*t=target->lChild; + while (t->rChild) { + p = t; + t=t->rChild; + }// 找到左子树最大的,是删除节点的直接“前驱” + + target->key = t->key; + + if (p!=target) { + p->rChild = t->lChild; + }else{ + target->lChild = t->lChild; + } + + free(t); + } + return 0; + } +``` + diff --git a/Graph/README.md b/5 Graph/README.md similarity index 83% rename from Graph/README.md rename to 5 Graph/README.md index fe4b73f..cbc6d6f 100644 --- a/Graph/README.md +++ b/5 Graph/README.md @@ -23,5 +23,8 @@ A* 用于游戏编程和分布式计算 +## +* 二部图 +* 有向无环图 DAG diff --git a/Sort/8.c b/6 Sort/8.c similarity index 100% rename from Sort/8.c rename to 6 Sort/8.c diff --git a/Sort/README.md b/6 Sort/README.md similarity index 100% rename from Sort/README.md rename to 6 Sort/README.md diff --git a/Sort/bubblesort.gif b/6 Sort/bubblesort.gif similarity index 100% rename from Sort/bubblesort.gif rename to 6 Sort/bubblesort.gif diff --git a/Sort/heapsort.gif b/6 Sort/heapsort.gif similarity index 100% rename from Sort/heapsort.gif rename to 6 Sort/heapsort.gif diff --git a/Sort/insert_sort.c b/6 Sort/insert_sort.c similarity index 100% rename from Sort/insert_sort.c rename to 6 Sort/insert_sort.c diff --git a/Sort/mergesort.gif b/6 Sort/mergesort.gif similarity index 100% rename from Sort/mergesort.gif rename to 6 Sort/mergesort.gif diff --git a/Sort/qsort.gif b/6 Sort/qsort.gif similarity index 100% rename from Sort/qsort.gif rename to 6 Sort/qsort.gif diff --git a/Sort/selectsort.gif b/6 Sort/selectsort.gif similarity index 100% rename from Sort/selectsort.gif rename to 6 Sort/selectsort.gif diff --git a/Sort/shellsort.gif b/6 Sort/shellsort.gif similarity index 100% rename from Sort/shellsort.gif rename to 6 Sort/shellsort.gif diff --git a/Search/README.md b/7 Search/README.md similarity index 100% rename from Search/README.md rename to 7 Search/README.md diff --git a/Algorithms Analysis/README.md b/8 Algorithms Analysis/README.md similarity index 100% rename from Algorithms Analysis/README.md rename to 8 Algorithms Analysis/README.md diff --git "a/Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" similarity index 100% rename from "Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" rename to "8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" diff --git "a/Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" similarity index 100% rename from "Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" rename to "8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" diff --git "a/Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" similarity index 100% rename from "Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" rename to "8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" diff --git "a/Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" "b/8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" similarity index 100% rename from "Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" rename to "8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" diff --git "a/Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" similarity index 100% rename from "Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" rename to "8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" diff --git "a/Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" "b/8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" similarity index 100% rename from "Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" rename to "8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" diff --git "a/Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" similarity index 100% rename from "Algorithms Analysis/\351\200\222\345\275\222.md" rename to "8 Algorithms Analysis/\351\200\222\345\275\222.md" diff --git a/Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md similarity index 100% rename from Algorithms Job Interview/README.md rename to 9 Algorithms Job Interview/README.md diff --git a/Algorithms Job Interview/leetcode.md b/9 Algorithms Job Interview/leetcode.md similarity index 100% rename from Algorithms Job Interview/leetcode.md rename to 9 Algorithms Job Interview/leetcode.md diff --git "a/Algorithms Job Interview/\344\271\235\345\272\246OJ.md" "b/9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" similarity index 100% rename from "Algorithms Job Interview/\344\271\235\345\272\246OJ.md" rename to "9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" diff --git "a/Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" similarity index 100% rename from "Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" rename to "9 Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" diff --git "a/Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" similarity index 100% rename from "Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" rename to "9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" diff --git "a/Algorithms Job Interview/\345\233\276.md" "b/9 Algorithms Job Interview/\345\233\276.md" similarity index 100% rename from "Algorithms Job Interview/\345\233\276.md" rename to "9 Algorithms Job Interview/\345\233\276.md" diff --git "a/Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" "b/9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" similarity index 100% rename from "Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" rename to "9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" diff --git "a/Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" similarity index 100% rename from "Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" rename to "9 Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" diff --git "a/Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" similarity index 100% rename from "Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" rename to "9 Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" diff --git "a/Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" similarity index 100% rename from "Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" rename to "9 Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" diff --git "a/Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" "b/9 Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" similarity index 100% rename from "Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" rename to "9 Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" diff --git "a/Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" similarity index 100% rename from "Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" diff --git "a/Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/9 Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" similarity index 100% rename from "Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" rename to "9 Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" diff --git "a/Algorithms Job Interview/\347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/\347\237\251\351\230\265.md" similarity index 100% rename from "Algorithms Job Interview/\347\237\251\351\230\265.md" rename to "9 Algorithms Job Interview/\347\237\251\351\230\265.md" diff --git "a/Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" "b/9 Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" similarity index 100% rename from "Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" rename to "9 Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" diff --git "a/Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" "b/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" similarity index 100% rename from "Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" rename to "9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" diff --git "a/Algorithms Job Interview/\351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/\351\223\276\350\241\250.md" similarity index 100% rename from "Algorithms Job Interview/\351\223\276\350\241\250.md" rename to "9 Algorithms Job Interview/\351\223\276\350\241\250.md" diff --git a/Algorithms In Big Data/Bitmap.md b/91 Algorithms In Big Data/Bitmap.md similarity index 100% rename from Algorithms In Big Data/Bitmap.md rename to 91 Algorithms In Big Data/Bitmap.md diff --git "a/Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" "b/91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" similarity index 100% rename from "Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" rename to "91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" diff --git "a/Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" "b/91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" similarity index 100% rename from "Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" rename to "91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" diff --git a/Algorithms In Big Data/README.md b/91 Algorithms In Big Data/README.md similarity index 100% rename from Algorithms In Big Data/README.md rename to 91 Algorithms In Big Data/README.md diff --git a/Algorithms In Big Data/btree_insert.gif b/91 Algorithms In Big Data/btree_insert.gif similarity index 100% rename from Algorithms In Big Data/btree_insert.gif rename to 91 Algorithms In Big Data/btree_insert.gif diff --git a/Algorithms In Big Data/disk_search.png b/91 Algorithms In Big Data/disk_search.png similarity index 100% rename from Algorithms In Big Data/disk_search.png rename to 91 Algorithms In Big Data/disk_search.png diff --git "a/Algorithms In Big Data/simhash\347\256\227\346\263\225.md" "b/91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" similarity index 100% rename from "Algorithms In Big Data/simhash\347\256\227\346\263\225.md" rename to "91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" diff --git "a/Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" "b/91 Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" similarity index 100% rename from "Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" rename to "91 Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" diff --git "a/Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" "b/91 Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" similarity index 100% rename from "Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" rename to "91 Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" diff --git "a/Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" "b/91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" similarity index 100% rename from "Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" rename to "91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" diff --git "a/Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" "b/91 Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" similarity index 100% rename from "Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" rename to "91 Algorithms In Big Data/\345\244\226\346\216\222\345\272\217.md" diff --git "a/Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" "b/91 Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" similarity index 100% rename from "Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" rename to "91 Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" diff --git a/Algorithms In DB/README.md b/92 Algorithms In DB/README.md similarity index 100% rename from Algorithms In DB/README.md rename to 92 Algorithms In DB/README.md diff --git a/Algorithms In Open Source/README.md b/93 Algorithms In Open Source/README.md similarity index 100% rename from Algorithms In Open Source/README.md rename to 93 Algorithms In Open Source/README.md diff --git a/Algorithms In Open Source/YYCache.md b/93 Algorithms In Open Source/YYCache.md similarity index 100% rename from Algorithms In Open Source/YYCache.md rename to 93 Algorithms In Open Source/YYCache.md diff --git a/15 Classic Algorithms/README.md b/94 15-Classic-Algorithms/README.md similarity index 100% rename from 15 Classic Algorithms/README.md rename to 94 15-Classic-Algorithms/README.md From d046cbc2f0c27e4880b996e75c1b0de9a61af24c Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 19 Mar 2021 13:10:27 +0800 Subject: [PATCH 027/151] add timer,merkle tree, geohash --- 93 Algorithms In Open Source/Bitcoin/Merkle Tree.md | 1 + ...2\271\347\264\242\345\274\225\347\256\227\346\263\225.md" | 2 ++ 93 Algorithms In Open Source/Timer/timer.md | 5 +++++ 93 Algorithms In Open Source/{ => YYKit}/YYCache.md | 0 4 files changed, 8 insertions(+) create mode 100644 93 Algorithms In Open Source/Bitcoin/Merkle Tree.md create mode 100644 "93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" create mode 100644 93 Algorithms In Open Source/Timer/timer.md rename 93 Algorithms In Open Source/{ => YYKit}/YYCache.md (100%) diff --git a/93 Algorithms In Open Source/Bitcoin/Merkle Tree.md b/93 Algorithms In Open Source/Bitcoin/Merkle Tree.md new file mode 100644 index 0000000..8e71d94 --- /dev/null +++ b/93 Algorithms In Open Source/Bitcoin/Merkle Tree.md @@ -0,0 +1 @@ +# Merkle Tree \ No newline at end of file diff --git "a/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" "b/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" new file mode 100644 index 0000000..4f7cfff --- /dev/null +++ "b/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" @@ -0,0 +1,2 @@ +# 多维空间点索引算法 + diff --git a/93 Algorithms In Open Source/Timer/timer.md b/93 Algorithms In Open Source/Timer/timer.md new file mode 100644 index 0000000..d53f6d7 --- /dev/null +++ b/93 Algorithms In Open Source/Timer/timer.md @@ -0,0 +1,5 @@ +# timer + +* 小顶堆/最小堆 +* 红黑树 +* 时间轮 \ No newline at end of file diff --git a/93 Algorithms In Open Source/YYCache.md b/93 Algorithms In Open Source/YYKit/YYCache.md similarity index 100% rename from 93 Algorithms In Open Source/YYCache.md rename to 93 Algorithms In Open Source/YYKit/YYCache.md From aca4ace0cdd8ae5a5e3719c97958b29aa6cc1936 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 19 Mar 2021 13:28:48 +0800 Subject: [PATCH 028/151] refactor --- ...6\350\277\207\346\273\244\345\231\250).md" | 89 ------- .../{ => Inverted Index}/btree_insert.gif | Bin .../{ => Inverted Index}/disk_search.png | Bin ...47\264\242\345\274\225(Inverted Index).md" | 0 ...56\345\272\223\347\264\242\345\274\225.md" | 0 .../{ => bloomfilter}/Bitmap.md | 0 ...6\350\277\207\346\273\244\345\231\250).md" | 232 ++++++++++++++++++ ...06\350\200\214\346\262\273\344\271\213.md" | 0 ...4\204\347\220\206\344\271\213Mapreduce.md" | 0 .../simhash\347\256\227\346\263\225.md" | 0 10 files changed, 232 insertions(+), 89 deletions(-) delete mode 100644 "91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" rename 91 Algorithms In Big Data/{ => Inverted Index}/btree_insert.gif (100%) rename 91 Algorithms In Big Data/{ => Inverted Index}/disk_search.png (100%) rename "91 Algorithms In Big Data/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" => "91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" (100%) rename "91 Algorithms In Big Data/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" => "91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" (100%) rename 91 Algorithms In Big Data/{ => bloomfilter}/Bitmap.md (100%) create mode 100644 "91 Algorithms In Big Data/bloomfilter/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" rename "91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" => "91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" (100%) rename "91 Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" => "91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" (100%) rename "91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" => "91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" (100%) diff --git "a/91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" "b/91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" deleted file mode 100644 index 250e642..0000000 --- "a/91 Algorithms In Big Data/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" +++ /dev/null @@ -1,89 +0,0 @@ - -## Bloom filter(布隆过滤器) - -Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 - - -### Bloom filter 特点 - -为了说明Bloom Filter存在的重要意义,举一个实例:假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,就会有如下几种方案: - -1. 将访问过的URL保存到数据库。 -2. 用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。 -3. URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库。 -4. BitMap方法。建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。 - -方法1~3都是将访问过的URL完整保存,方法4则只标记URL的一个映射位。以上方法在数据量较小的情况下都能完美解决问题,但是当数据量变得非常庞大时问题就来了。 - -方法1的缺点:数据量变得非常庞大后关系型数据库查询的效率会变得很低。而且每来一个URL就启动一次数据库查询是不是太小题大做了? -方法2的缺点:太消耗内存。随着URL的增多,占用的内存会越来越多。就算只有1亿个URL,每个URL只算50个字符,就需要5GB内存。 -方法3:由于字符串经过MD5处理后的信息摘要长度只有128Bit,SHA-1处理后也只有160Bit,因此方法3比方法2节省了好几倍的内存。 -方法4消耗内存是相对较少的,但缺点是单一哈希函数发生冲突的概率太高。还记得数据结构课上学过的Hash表冲突的各种解决方法么?若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。 - -实质上上面的算法都忽略了一个重要的隐含条件:允许小概率的出错,不一定要100%准确!也就是说少量url实际上没有没网络蜘蛛访问,而将它们错判为已访问的代价是很小的——大不了少抓几个网页呗。 - - -### Bloom filter 算法 - -Bloom filter可以看做是对bitmap的扩展。只是使用多个hash映射函数,从而减低hash发生冲突的概率。算法如下: - -1. 创建 m 位的bitset,初始化为0, 选中k个不同的哈希函数 -2. 第 i 个hash 函数对字符串str 哈希的结果记为 h(i,str) ,范围是(0,m-1) -3. 将字符串记录到bitset的过程:对于一个字符串str,分别记录h(1,str),h(2,str)...,h(k,str)。 然后将bitset的h(1,str),h(2,str)...,h(k,str)位置1。也就是将一个str映射到bitset的 k 个二进制位。 - -4. 检查字符串是否存在:对于字符串str,分别计算h(1,str)、h(2,str),...,h(k,str)。然后检查BitSet的第h(1,str)、h(2,str),...,h(k,str) 位是否为1,若其中任何一位不为1则可以判定str一定没有被记录过。若全部位都是1,则“认为”字符串str存在。但是若一个字符串对应的Bit全为1,实际上是不能100%的肯定该字符串被Bloom Filter记录过的。(因为有可能该字符串的所有位都刚好是被其他字符串所对应)这种将该字符串划分错的情况,称为false positive 。 - -5. 删除字符串:字符串加入了就被不能删除了,因为删除会影响到其他字符串。实在需要删除字符串的可以使用Counting bloomfilter(CBF)。 - - -`Bloom Filter 使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。` - - - -### 最优的哈希函数个数,位数组m大小 - -哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等概率的将字符串映射到各个Bit。选择k个不同的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,然后送入k个不同的参数。 - -在原始个数位n时,那这里的k应该取多少呢?位数组m大小应该取多少呢?这里有个计算公式:`k=(ln2)*(m/n)`, 当满足这个条件时,错误率最小。 - - -假设错误率为0.01, 此时m 大概是 n 的13倍,k大概是8个。 这里的n是元素记录的个数,m是bit位个数。如果每个元素的长度原大于13,使用Bloom Filter就可以节省内存。 - - -### 错误率估计 - - - -### 实现示例 - -``` -#define SIZE 15*1024*1024 -char a[SIZE]; /* 15MB*8 = 120M bit空间 */ -memset(a,0,SIZE); - -int seeds[] = { 5, 7, 11, 13, 31, 37, 61}; - -int hashcode(int cap,int seed, string key){ - int hash = 0; - for (int i=0;i>> 16)) & Integer.MAX_VALUE; + } + +} +``` + + +``` +public class ByteBufferBloomFilter { + + /** + * 存储BloomFilter数据 + */ + private final ByteBuffer data; + + private final int size;//占用空间 + + + /** + * 构造BloomFilter + * @param size 占用空间(字节数),应设为key总数的1.5倍以上,最大不超过2G + */ + public ByteBufferBloomFilter(int size) { + if (size <= 0) { + throw new IllegalArgumentException("size must > 0"); + } + this.size = size; + this.data = ByteBuffer.allocateDirect(size); + } + + + @Override + public void put(String key) { + int[] hs = Hash.hashes(key, size); + for (int i = 0; i < hs.length; i++) { + int idx = hs[i]; + int b = data.get(idx); + data.put(idx, (byte) (b | (1 << i))); + } + } + + @Override + public boolean contains(String key) { + int[] hs = Hash.hashes(key, size); + for (int i = 0; i < hs.length; i++) { + int b = data.get(hs[i]); + if ((b & (1 << i)) == 0) { + return false; + } + } + return true; + } + + + @Override + public int size() { + return size; + } +} +``` + +对每个字符串str求哈希就可以使用 `hashcode(SIZE*8,seeds[i],str)` ,i 的取值范围就是 (0,k)。 + + + + + +## 参考 + +http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html +http://blog.csdn.net/jiaomeng/article/details/1495500 +http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html `哈希函数个数k、位数组大小m` 测试论证 +https://blog.csdn.net/tianyaleixiaowu/article/details/74721877 +https://juejin.im/post/5bc7446e5188255c791b3360 + + + diff --git "a/91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" "b/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" similarity index 100% rename from "91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" rename to "91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" diff --git "a/91 Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" "b/91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" similarity index 100% rename from "91 Algorithms In Big Data/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" rename to "91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" diff --git "a/91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" "b/91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" similarity index 100% rename from "91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" rename to "91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" From d25a9efb3ef4e08cace7e2b3b0af93bfaebf7b6f Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 19 Mar 2021 13:31:22 +0800 Subject: [PATCH 029/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8C=E9=83=A8?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\214\351\203\250\345\233\276.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "5 Graph/\344\272\214\345\210\206\345\233\276/\344\272\214\351\203\250\345\233\276.md" diff --git "a/5 Graph/\344\272\214\345\210\206\345\233\276/\344\272\214\351\203\250\345\233\276.md" "b/5 Graph/\344\272\214\345\210\206\345\233\276/\344\272\214\351\203\250\345\233\276.md" new file mode 100644 index 0000000..e021fe3 --- /dev/null +++ "b/5 Graph/\344\272\214\345\210\206\345\233\276/\344\272\214\351\203\250\345\233\276.md" @@ -0,0 +1 @@ +# 二部图 \ No newline at end of file From 216d4fae4441ee1638525a346d5d4d80992f5076 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 19 Mar 2021 13:35:07 +0800 Subject: [PATCH 030/151] remove --- ...11\346\237\245\346\211\276\346\240\221.md" | 109 ------------------ 1 file changed, 109 deletions(-) delete mode 100644 "4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" diff --git "a/4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" deleted file mode 100644 index 6e23115..0000000 --- "a/4 Tree/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" +++ /dev/null @@ -1,109 +0,0 @@ - -## 二叉查找树 - -二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。是指一个空树或者具有下列性质的二叉树: - - 1. 若任意节点的左子树不为空,则左子树上所有的节点值小于它的根节点值 - 2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值 - 3. 任意节点左右子树也为二叉查找树 - 4. 没有键值相等的节点 - - ``` - typedef int ElemType; - typedef struct BiSearchTree{ - ElemType key; - struct BiSearchTree *lChild; - struct BiSearchTree *rChild; - }BiSearchTree; - BiSearchTree *bisearch_tree_insert(BiSearchTree *tree,ElemType node); - int bisearch_tree_delete(BiSearchTree **tree,ElemType node); - int bisearch_tree_search(BiSearchTree *tree,ElemType node); - ``` - - -删除节点,需要重建排序树 - - 1) 删除节点是叶子节点(分支为0),结构不破坏 - 2)删除节点只有一个分支(分支为1),结构也不破坏 - 3)删除节点有2个分支,此时删除节点 - -思路一: 选左子树的最大节点,或右子树最小节点替换 - -``` -int bisearch_tree_delete(BiSearchTree **tree,ElemType node){ - - if (NULL==tree) { - return -1; - } - // 查找删除目标节点 - BiSearchTree *target=*tree,*parent=NULL; - while (NULL!=target) { - if (nodekey) { - parent=target; - target=target->lChild; - }else if(node==target->key){ - break; - }else{ - parent=target; - target=target->rChild; - } - } - - if (NULL==target) { - printf("树为空,或想要删除的节点不存在\n"); - return -1; - } - //该节点为叶子节点,直接删除 - if (!target->rChild && !target->lChild) - { - if (NULL==parent) {////只有一个节点的二叉查找树 - *tree=NULL; - }else{ - if (target->key>parent->key) { - parent->rChild=NULL; - }else{ - parent->lChild=NULL; - } - - } - free(target);//父节点处理,不然野指针,造成崩溃 - } - - else if(!target->rChild){ //右子树空则只需重接它的左子树,用左子树替换掉当前要删除的节点 - BiSearchTree *del=target->lChild; - target->key = target->lChild->key; - target->lChild=target->lChild->lChild; - target->rChild=target->lChild->rChild; - - free(del); - } - else if(!target->lChild){ //左子树空只需重接它的右子树 - BiSearchTree *del=target->rChild; - target->key = target->rChild->key; - target->lChild=target->rChild->lChild; - target->rChild=target->rChild->rChild; - - free(del); - } - else{ //左右子树均不空,p,t 2个指针一前以后,将左子树最大的节点(肯定是一个最右的节点)替换到删除的节点后,还需要处理左子树最大节点的左子树 - - BiSearchTree *p=target,*t=target->lChild; - while (t->rChild) { - p = t; - t=t->rChild; - }// 找到左子树最大的,是删除节点的直接“前驱” - - target->key = t->key; - - if (p!=target) { - p->rChild = t->lChild; - }else{ - target->lChild = t->lChild; - } - - free(t); - } - return 0; - } -``` - From a3f2155ba048e52105b58171b8de0c125891b85e Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 19 Mar 2021 13:40:05 +0800 Subject: [PATCH 031/151] add kafka,nginx,zk --- 92 Algorithms In DB/mysql/README.md | 0 92 Algorithms In DB/redis/README.md | 1 + 93 Algorithms In Open Source/kafka/README.md | 1 + 93 Algorithms In Open Source/nginx/README.md | 1 + 93 Algorithms In Open Source/zoomkeeper/README.md | 1 + 5 files changed, 4 insertions(+) create mode 100644 92 Algorithms In DB/mysql/README.md create mode 100644 92 Algorithms In DB/redis/README.md create mode 100644 93 Algorithms In Open Source/kafka/README.md create mode 100644 93 Algorithms In Open Source/nginx/README.md create mode 100644 93 Algorithms In Open Source/zoomkeeper/README.md diff --git a/92 Algorithms In DB/mysql/README.md b/92 Algorithms In DB/mysql/README.md new file mode 100644 index 0000000..e69de29 diff --git a/92 Algorithms In DB/redis/README.md b/92 Algorithms In DB/redis/README.md new file mode 100644 index 0000000..4e768b5 --- /dev/null +++ b/92 Algorithms In DB/redis/README.md @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/93 Algorithms In Open Source/kafka/README.md b/93 Algorithms In Open Source/kafka/README.md new file mode 100644 index 0000000..4287ca8 --- /dev/null +++ b/93 Algorithms In Open Source/kafka/README.md @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/93 Algorithms In Open Source/nginx/README.md b/93 Algorithms In Open Source/nginx/README.md new file mode 100644 index 0000000..4e768b5 --- /dev/null +++ b/93 Algorithms In Open Source/nginx/README.md @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/93 Algorithms In Open Source/zoomkeeper/README.md b/93 Algorithms In Open Source/zoomkeeper/README.md new file mode 100644 index 0000000..4287ca8 --- /dev/null +++ b/93 Algorithms In Open Source/zoomkeeper/README.md @@ -0,0 +1 @@ +# \ No newline at end of file From 240abc4470d878baf8153d647221bbaf913b6fdf Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 19 Mar 2021 13:45:57 +0800 Subject: [PATCH 032/151] clean dump --- images/bubble-sort.gif | Bin 98853 -> 0 bytes images/fast-sort.gif | Bin 93016 -> 0 bytes images/heap-sort.gif | Bin 281018 -> 0 bytes images/merge-sort.gif | Bin 13371 -> 0 bytes images/select-sort.gif | Bin 13383 -> 0 bytes images/shell-sort.gif | Bin 758747 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/bubble-sort.gif delete mode 100644 images/fast-sort.gif delete mode 100644 images/heap-sort.gif delete mode 100644 images/merge-sort.gif delete mode 100644 images/select-sort.gif delete mode 100644 images/shell-sort.gif diff --git a/images/bubble-sort.gif b/images/bubble-sort.gif deleted file mode 100644 index 03236caf86a07d2080fa4533c337d2fff6396399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98853 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
  • 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

    t&_fIH9=cpGMizcUHzOedg@cSu<1 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


    wF}8}3F$37I&#iv013V4G9o-$w2C}2 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 z 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 IQILfG3pta*O#lD@ diff --git a/images/merge-sort.gif b/images/merge-sort.gif deleted file mode 100644 index 40f3c04f6292be6c04ed0d54162700249af1a0ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13371 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 diff --git a/images/select-sort.gif b/images/select-sort.gif deleted file mode 100644 index 3261137b61c2388f0b56d0fc21e58b74fccc738f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13383 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 diff --git a/images/shell-sort.gif b/images/shell-sort.gif deleted file mode 100644 index 8138ef79f4a4674f62fdb2f228be8f42dc3312a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 758747 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 From b8b3ccb70f83a5d841e3e05f847a98f3fde3a3cd Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 25 Mar 2021 16:48:34 +0800 Subject: [PATCH 033/151] qps counter --- 2 Link List/QPS Counter.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 2 Link List/QPS Counter.md diff --git a/2 Link List/QPS Counter.md b/2 Link List/QPS Counter.md new file mode 100644 index 0000000..2749960 --- /dev/null +++ b/2 Link List/QPS Counter.md @@ -0,0 +1,4 @@ +# QPS Counter + +统计各接口QPS计数 +使用一个双向循环链表结构 \ No newline at end of file From aeb59a9453bad074315283675c184792cf287376 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 25 Mar 2021 16:48:50 +0800 Subject: [PATCH 034/151] condition parse --- ...\273\266\350\241\250\350\276\276\345\274\217.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" diff --git "a/2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" "b/2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" new file mode 100644 index 0000000..0ab5558 --- /dev/null +++ "b/2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" @@ -0,0 +1,13 @@ +# 条件表达式 + + +### 应用场景 + +* SQL 语句中的条件 +* 广告系统中配置定向的过滤条件 +* 编译器语法解析 + + + +DNF 析取范式 + From d2e45086e58dfa2483c3bec6467f3ff118c9a251 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 25 Mar 2021 16:49:05 +0800 Subject: [PATCH 035/151] reversed indexer --- ...345\217\215\345\220\221\347\264\242\345\274\225.md" | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 "3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" diff --git "a/3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" "b/3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" new file mode 100644 index 0000000..bb0e1a2 --- /dev/null +++ "b/3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" @@ -0,0 +1,10 @@ +# 反向索引 + +### 应用场景 + +* ES +* 推荐内容召回 + + + + From 06e2d4b2ab1387d4bd20a70503fd8e2cdb6a15d6 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 25 Mar 2021 17:10:26 +0800 Subject: [PATCH 036/151] rename list --- {2 Link List => 2 List}/QPS Counter.md | 0 {2 Link List => 2 List}/README.md | 0 ...46\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {2 Link List => 2 List}/QPS Counter.md (100%) rename {2 Link List => 2 List}/README.md (100%) rename "2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" => "2 List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" (100%) diff --git a/2 Link List/QPS Counter.md b/2 List/QPS Counter.md similarity index 100% rename from 2 Link List/QPS Counter.md rename to 2 List/QPS Counter.md diff --git a/2 Link List/README.md b/2 List/README.md similarity index 100% rename from 2 Link List/README.md rename to 2 List/README.md diff --git "a/2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" "b/2 List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" similarity index 100% rename from "2 Link List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" rename to "2 List/\346\235\241\344\273\266\350\241\250\350\276\276\345\274\217.md" From 8cf5ef38319c5b6a724c71c1422076da353f15dd Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 25 Mar 2021 17:14:57 +0800 Subject: [PATCH 037/151] hashmap impl in golang/java --- 3 Hash Table/HashMap in Golang.md | 3 +++ 3 Hash Table/HashMap in Java.md | 4 ++++ 2 files changed, 7 insertions(+) create mode 100644 3 Hash Table/HashMap in Golang.md create mode 100644 3 Hash Table/HashMap in Java.md diff --git a/3 Hash Table/HashMap in Golang.md b/3 Hash Table/HashMap in Golang.md new file mode 100644 index 0000000..bbcf5fe --- /dev/null +++ b/3 Hash Table/HashMap in Golang.md @@ -0,0 +1,3 @@ +# HashMap in Golang + +java 中 hashmap的实现原理 diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md new file mode 100644 index 0000000..1844f98 --- /dev/null +++ b/3 Hash Table/HashMap in Java.md @@ -0,0 +1,4 @@ +# HashMap in Java + +java 中 hashmap的实现原理 + From d7fd369cb215ede647118a1edccaeac61ce33b4f Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 25 Mar 2021 17:25:43 +0800 Subject: [PATCH 038/151] update geohash --- ...\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" "b/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" index 4f7cfff..1e1eea9 100644 --- "a/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" +++ "b/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" @@ -1,2 +1,4 @@ # 多维空间点索引算法 +经纬度信息与GeoHash值互转 + From 81682a605136a6007ded395b787b4902bce86994 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Fri, 26 Mar 2021 13:34:07 +0800 Subject: [PATCH 039/151] redis slowlog --- 2 List/Redis slowlog.md | 66 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 2 List/Redis slowlog.md diff --git a/2 List/Redis slowlog.md b/2 List/Redis slowlog.md new file mode 100644 index 0000000..21472d4 --- /dev/null +++ b/2 List/Redis slowlog.md @@ -0,0 +1,66 @@ +# Redis slowlog + + +redis中的slowlog使用链表来保存 + + +``` +struct redisServer { + + // ... + + + // 下一条慢查询日志的 ID + long long slowlog_entry_id; + + + // 保存了所有慢查询日志的链表 + list *slowlog; + + + // 服务器配置 slowlog-log-slower-than 选项的值 + long long slowlog_log_slower_than; + + + // 服务器配置 slowlog-max-len 选项的值 + unsigned long slowlog_max_len; + + + // ... + +}; +``` + + +一条slowlog entry标识 + +``` +typedef struct slowlogEntry { + + + // 唯一标识符 + long long id; + + + // 命令执行时的时间,格式为 UNIX 时间戳 + time_t time; + + + // 执行命令消耗的时间,以微秒为单位 + long long duration; + + + // 命令与命令参数 + robj **argv; + + + // 命令与命令参数的数量 + int argc; + + +} slowlogEntry; + +``` + + + From aae6f5131d5e81fc1a252c6c658ae772807d65bf Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 31 Mar 2021 10:39:02 +0800 Subject: [PATCH 040/151] update graph --- 5 Graph/README.md | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/5 Graph/README.md b/5 Graph/README.md index cbc6d6f..899e77d 100644 --- a/5 Graph/README.md +++ b/5 Graph/README.md @@ -1,16 +1,43 @@ +# 图 +### 什么是图 -## 图 +图论(Graph theory)是数学的一个分支,它以图为研究对象,研究顶点和边组成的图形的数学理论和方法。图论中的图是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用顶点代表事物,用连接两顶点的边表示相应两个事物间具有这种关系。 +图论的研究对象相当于一维的拓扑学。 -### 图的存储结构 + +### 应用场景 + +工业界有哪些应用场景 + +* 匹配,如打车中司乘匹配引擎,如何做到效率最优 +* 并行任务调度,一组任务,任务有优先级,如何合理安排任务调度,在最短时间内完成 +* 套汇 + +### 基本概念 + +** 有向图 ** + +有向图,就是有方向的图 + +** 无向图 ** + +就是没有方向的图 + +** 环 ** + +首尾相接的路径我们就把它叫做一个环。 + + +# 图的存储结构 * 对象和指针 * 矩阵 * 邻接表 -### 图的操作 +## 图的操作 #### 遍历 @@ -23,8 +50,12 @@ A* 用于游戏编程和分布式计算 -## +## 图延伸 * 二部图 * 有向无环图 DAG + +### 参考 + +https://www.jiqizhixin.com/articles/2019-05-16-14 From 4f781839e565218f68bc0d3aa839a5aa1aa139a5 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 31 Mar 2021 10:39:44 +0800 Subject: [PATCH 041/151] add tree --- "4 Tree/7-B\346\225\260/B+\346\240\221.md" | 1 + .../\347\272\242\351\273\221\346\240\221.md" | 14 ++++++++++++++ ...217\215\345\220\221\347\264\242\345\274\225.md" | 13 +++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 "4 Tree/7-B\346\225\260/B+\346\240\221.md" create mode 100644 "4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" create mode 100644 "4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" diff --git "a/4 Tree/7-B\346\225\260/B+\346\240\221.md" "b/4 Tree/7-B\346\225\260/B+\346\240\221.md" new file mode 100644 index 0000000..cc6df39 --- /dev/null +++ "b/4 Tree/7-B\346\225\260/B+\346\240\221.md" @@ -0,0 +1 @@ +# B+树 diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" new file mode 100644 index 0000000..818062d --- /dev/null +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -0,0 +1,14 @@ +# 红黑树 (red-black tree) + + +### 应用场景 + + +java 中 HashMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 +关于 HashMap 实现解析参考 [这里](.../Hash Table/HashMap in Java.md) + + + + + + diff --git "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" new file mode 100644 index 0000000..7665d81 --- /dev/null +++ "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" @@ -0,0 +1,13 @@ +# 反向索引 + +### 应用场景 + +* ES +* 推荐内容召回 +* mysql中的索引实现 + + +通常使用 B+ 树实现。 + + + From 3493061af4cb61ee7d51d99924fe6df19693a0e0 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 31 Mar 2021 10:40:06 +0800 Subject: [PATCH 042/151] update hashmap --- 3 Hash Table/HashMap in Java.md | 2 +- ...345\217\215\345\220\221\347\264\242\345\274\225.md" | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) delete mode 100644 "3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 1844f98..9c81564 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -1,4 +1,4 @@ # HashMap in Java -java 中 hashmap的实现原理 +java 中 hashmap的实现原理。 diff --git "a/3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" "b/3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" deleted file mode 100644 index bb0e1a2..0000000 --- "a/3 Hash Table/\345\217\215\345\220\221\347\264\242\345\274\225.md" +++ /dev/null @@ -1,10 +0,0 @@ -# 反向索引 - -### 应用场景 - -* ES -* 推荐内容召回 - - - - From 29c183ce344f2a6b61c43687c3d9015537ed23f1 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 31 Mar 2021 10:43:23 +0800 Subject: [PATCH 043/151] update graph --- 5 Graph/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/5 Graph/README.md b/5 Graph/README.md index 899e77d..259cfff 100644 --- a/5 Graph/README.md +++ b/5 Graph/README.md @@ -13,8 +13,12 @@ * 匹配,如打车中司乘匹配引擎,如何做到效率最优 * 并行任务调度,一组任务,任务有优先级,如何合理安排任务调度,在最短时间内完成 +* 导航路径规划,在使用导航软件时,用户在选择一个开始地点和目的地之后导航软件会给出各种如路程最短,不走高速,时长最短等方案 +* 社区发现,在好友关系中,根据社区之间联系或紧密,利用图 louvain 算法或者其他算法对用户进行分群从而达到精准营销,个性化服务等 +* 金融贷后催收:利用图算法找出符合条件的失联人的联系人,从而提高催收失联修复的覆盖率、有效联系率,助力不良资产的回收 * 套汇 + ### 基本概念 ** 有向图 ** From 0e1c1a93368ff9bf0285a2ae0ec4f9a96f9f3007 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 31 Mar 2021 10:53:40 +0800 Subject: [PATCH 044/151] update hash --- 3 Hash Table/README.md | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/3 Hash Table/README.md b/3 Hash Table/README.md index 660e04e..337e426 100644 --- a/3 Hash Table/README.md +++ b/3 Hash Table/README.md @@ -1,6 +1,4 @@ - - -## 散列表 +# 散列表 本节围绕以下内容展开: @@ -16,7 +14,18 @@ 散列表是算法在时间和空间上做出权衡的经典例子。通过一个散列函数,将键值key映射到记录的访问地址,达到快速查找的目的。如果没有内存限制,我们可以直接将键作为数组的索引,所有的操作操作只需要一次访问内存就可以完成。但这种情况不太现实。 -### 散列函数 + +## Hashmap应用 + +1. cocos2d 游戏引擎 CCScheduler +2. linux 内核bcache。 缓存加速技术,使用SSD固态硬盘作为高速缓存,提高慢速存储设备HDD机械硬盘的性能 +3. hash表在海量数据处理中有广泛应用。如海量日志中,提取出某日访问百度次数最多的IP +4. Java 中HashMap实现。编程语言中HashMap是如何实现的呢? 说说 Java , Golang +5. redis hash结构, set通常也是基于Hash结构实现 + + + +## 散列函数 散列函数就是将键转化为数组索引的过程。且这个函数应该易于计算且能够均与分布所有的键。 @@ -50,7 +59,12 @@ Hash hashCode(char *key){ 当然,还有其他的散列函数,如`平方取中法`, `随机数法`等。 -### 碰撞解决 +## 碰撞解决 + +** 负载因子(load factor)** + +hash 表有一个特性, 随着元素越来越多, 新插入一个元素发生hash冲突的次数就会越来越多, 查找一个元素的速度也会越来越慢。 + 不同的关键字得到同一个散列地址` f(key1)=f(key2) `,即为碰撞 。这是我们需要尽量避免的情况。常见的处理方法有: @@ -58,7 +72,7 @@ Hash hashCode(char *key){ 2. 线性探测法 -#### 拉链法 +### 拉链法 将大小为M的数组中的每个元素指向一条链表,链表中的每个节点都存储了散列值为该元素索引的键值对。每条链表的平均长度是N/M,N是键值对的总个数。如下图: @@ -79,12 +93,12 @@ Hash hashCode(char *key){ 3. 遍历链表,删除结点 -#### 线性探测法 +### 线性探测法 使用大小为M的数组保存N个键值对,当碰撞发生时,直接检查散列表中的下一个位置。 -### 数据结构和算法 +## 数据结构和算法 这里给出拉链法构造的hashmap的算法,表示如下: @@ -198,17 +212,11 @@ HashMap *_putInList(HashMap *hashMap,int index,Key key,Value value){ ``` -### Hashmap应用 - -1. cocos2d 游戏引擎 CCScheduler -2. linux 内核bcache。 缓存加速技术,使用SSD固态硬盘作为高速缓存,提高慢速存储设备HDD机械硬盘的性能 -3. hash表在海量数据处理中有广泛应用。如海量日志中,提取出某日访问百度次数最多的IP - - -## Java 中HashMap实现 +### 扩容 -编程语言中HashMap是如何实现的呢? 说说 Java , Golang +当hash表保存的键值对数量太多或太少,对hash 表进行扩容和缩容。合理控制内存的使用。 +redis hash中, rehash发生在扩容或缩容阶段,扩容是发生在元素的个数等于哈希表数组的长度时,进行2倍的扩容;缩容发生在当元素个数为数组长度的10%时,进行缩容 ## 参考 From 47756bb8090d8055d0444e7b0f97e3f4e796ce37 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 6 Apr 2021 21:57:30 +0800 Subject: [PATCH 045/151] update hashmap --- 2 List/README.md | 22 ++++++++++++++--- 3 Hash Table/HashMap in Java.md | 44 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/2 List/README.md b/2 List/README.md index 8ce3769..9e4b586 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -1,15 +1,21 @@ - -## 链表 +# 链表 * 链表 * 双向链表 +* 双向循环链表 -### 链表 +## 链表 这个就不介绍了。重点说下双向链表。 -### 双向链表 +### 扩缩容 + +简单说下编程语言 java, golang中 LinkList的扩缩容的策略。 + + + +## 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 @@ -25,4 +31,12 @@ typedef struct Entry{ ``` +## 双向循环链表 + + + + + + + diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 9c81564..fd86e74 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -2,3 +2,47 @@ java 中 hashmap的实现原理。 +``` +public class HashMap extends AbstractMap + implements Map, Cloneable, Serializable { + + static class Node implements Map.Entry { + final int hash; + final K key; + V value; + Node next; + ... + } + + static final class TreeNode extends LinkedHashMap.Entry { + TreeNode parent; // red-black tree links + TreeNode left; + TreeNode right; + TreeNode prev; // needed to unlink next upon deletion + boolean red; + } + + public V put(K key, V value) { + return putVal(hash(key), key, value, false, true); + } + + public V get(Object key) { + Node e; + return (e = getNode(hash(key), key)) == null ? null : e.value; + } + +} +``` + + +### 扩容 + + + + + + + + + + From 4ed94bf729713e00c677adb2b31b262fb4a98554 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 13 Apr 2021 10:25:46 +0800 Subject: [PATCH 046/151] update hashmap --- 3 Hash Table/HashMap in Java.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index fd86e74..c74444f 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -2,6 +2,19 @@ java 中 hashmap的实现原理。 + +* HashMap底层实现, hashmap的存储结构和操作? +* hashmap的数组长度为什么要保证是2的幂? +* hash冲突如何解决(链表和红黑树)为什么hashmap中的链表需要转成红黑树? +* 扩容时机,什么时候会触发扩容?扩容时避免rehash的优化; +* hashmap扩容时每个entry需要再计算一次hash吗? +* hashmap扩容会引发什么问题,线上是否出现过类似的问题?如何避免扩容引发的问题? +* jdk1.8之前并发操作hashmap时为什么会有死循环的问题? + + +## 数据结构 + + ``` public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { @@ -35,8 +48,15 @@ public class HashMap extends AbstractMap ``` -### 扩容 +## Hash冲突 + + +## 扩容 + + + +## 问题 From 1d88af73a9263880ad6df0d006eae5f7e5325bd6 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 17 Apr 2021 14:05:08 +0800 Subject: [PATCH 047/151] add lru, lfu --- 3 Hash Table/LFU.md | 4 ++++ 3 Hash Table/LRU.md | 1 + 2 files changed, 5 insertions(+) create mode 100644 3 Hash Table/LFU.md create mode 100644 3 Hash Table/LRU.md diff --git a/3 Hash Table/LFU.md b/3 Hash Table/LFU.md new file mode 100644 index 0000000..163f0ad --- /dev/null +++ b/3 Hash Table/LFU.md @@ -0,0 +1,4 @@ +# LFU + + + diff --git a/3 Hash Table/LRU.md b/3 Hash Table/LRU.md new file mode 100644 index 0000000..8d95a56 --- /dev/null +++ b/3 Hash Table/LRU.md @@ -0,0 +1 @@ +# LRU \ No newline at end of file From 9ca24bc9a4439e11db8aa040e2db99f73d341072 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 17 Apr 2021 23:02:33 +0800 Subject: [PATCH 048/151] update skip-list --- 2 List/skip-list.md | 23 +++++++++++++++++++ ...42\345\274\225\347\256\227\346\263\225.md" | 2 ++ 2 files changed, 25 insertions(+) create mode 100644 2 List/skip-list.md diff --git a/2 List/skip-list.md b/2 List/skip-list.md new file mode 100644 index 0000000..39be2d8 --- /dev/null +++ b/2 List/skip-list.md @@ -0,0 +1,23 @@ +# skip-list + +skip-list 跳表。 redis 中的 sset(有序集合) 使用跳表来实现,为什么不是用红黑树,而是跳表实现sset,带着这样的疑问,有了本文。 + + +## 跳表理解 + + + +## 跳表的结构 + + + + +## 插入,删除,查找 实现 + + + +## sset 为什么使用 跳表 + + + + diff --git "a/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" "b/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" index 1e1eea9..ce46461 100644 --- "a/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" +++ "b/93 Algorithms In Open Source/GeoHash/\345\244\232\347\273\264\347\251\272\351\227\264\347\202\271\347\264\242\345\274\225\347\256\227\346\263\225.md" @@ -2,3 +2,5 @@ 经纬度信息与GeoHash值互转 +redis 中也有 geohash 算法的实现。 + From 565c23d47333bf3475312a1514fbd34824b94f7f Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 18 Apr 2021 14:30:14 +0800 Subject: [PATCH 049/151] update list --- 2 List/skip-list.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2 List/skip-list.md b/2 List/skip-list.md index 39be2d8..4e936d4 100644 --- a/2 List/skip-list.md +++ b/2 List/skip-list.md @@ -6,6 +6,8 @@ skip-list 跳表。 redis 中的 sset(有序集合) 使用跳表来实现,为 ## 跳表理解 +有哪些应用场景? + ## 跳表的结构 From dafa66a797ddd94ab01c45d959711fc4146d16c3 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 18 Apr 2021 15:20:37 +0800 Subject: [PATCH 050/151] update hashmap --- 2 List/README.md | 8 ++++++++ 3 Hash Table/HashMap in Java.md | 31 ++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/2 List/README.md b/2 List/README.md index 9e4b586..35539af 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -13,6 +13,10 @@ 简单说下编程语言 java, golang中 LinkList的扩缩容的策略。 +java 中扩容,每次扩容新增原先容量的 1/2 +``` + int newCapacity = oldCapacity + (oldCapacity >> 1); +``` ## 双向链表 @@ -30,6 +34,10 @@ typedef struct Entry{ ``` +## 循环链表 + +最后一个节点指针指向头节点的链表 + ## 双向循环链表 diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index c74444f..1ad0a80 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -19,11 +19,15 @@ java 中 hashmap的实现原理。 public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { + int threshold; //扩容 capacity * load factor + + final float loadFactor; //默认 0.75 + static class Node implements Map.Entry { final int hash; final K key; V value; - Node next; + Node next;//链表结构 ... } @@ -44,21 +48,46 @@ public class HashMap extends AbstractMap return (e = getNode(hash(key), key)) == null ? null : e.value; } + //hash 算法, 根据 key 的 hashCode() 计算而来 + static final int hash(Object key) { + int h; + return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); + } + } ``` + + ## Hash冲突 +HashMap是怎么处理hash碰撞的? + + ## 扩容 +初始化容量, 默认结果是 16 + +``` +static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16, 为啥用位运算呢?直接写16不好么? +``` + + +HashMap的扩容方式? 负载因子是多少? 为什是这么多? + +HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。那么问题来了,扩容到多达? 扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? + ## 问题 +### 链表上使用的头插还是尾插方式? + +### 多线程下死循环问题 From ea18abeb4c71c6738f093c968953a4e961c24326 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 26 Apr 2021 16:27:22 +0800 Subject: [PATCH 051/151] update hashmap --- 3 Hash Table/HashMap in Java.md | 117 ++++++++++++++++++++++++++++++-- 3 Hash Table/README.md | 1 - 2 files changed, 112 insertions(+), 6 deletions(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 1ad0a80..e5b80ae 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -19,10 +19,17 @@ java 中 hashmap的实现原理。 public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { - int threshold; //扩容 capacity * load factor + transient int size; //当前元素个数 - final float loadFactor; //默认 0.75 + int threshold; //扩容时机是: 当前容量大于等于 capacity * load factor + final float loadFactor; //默认 0.75 , 空间使用 75% 时开始扩容 + + static final int TREEIFY_THRESHOLD = 8; //将链表转换为红黑树的阈值 + + static final int UNTREEIFY_THRESHOLD = 6; //将红黑树转换为链表的阈值 + + //1.7结构 static class Node implements Map.Entry { final int hash; final K key; @@ -31,6 +38,7 @@ public class HashMap extends AbstractMap ... } + //1.8结构 static final class TreeNode extends LinkedHashMap.Entry { TreeNode parent; // red-black tree links TreeNode left; @@ -57,14 +65,96 @@ public class HashMap extends AbstractMap } ``` +1.7 的实现是 数组+链表; 1.8 新增了红黑树,提高查询效率 + + +get(key) 方法 + +``` +public V get(Object key) { + Node e; + return (e = getNode(hash(key), key)) == null ? null : e.value; +} +final Node getNode(int hash, Object key) { + Node[] tab; Node first, e; int n; K k; + if ((tab = table) != null && (n = tab.length) > 0 && + (first = tab[(n - 1) & hash]) != null) { + if (first.hash == hash && // always check first node + ((k = first.key) == key || (key != null && key.equals(k)))) + return first; + if ((e = first.next) != null) { + if (first instanceof TreeNode)//红黑树 查找 + return ((TreeNode)first).getTreeNode(hash, key); + do {//按照链表结构遍历查找 + if (e.hash == hash && + ((k = e.key) == key || (key != null && key.equals(k)))) + return e; + } while ((e = e.next) != null); + } + } + return null; +} +``` + +put(key, value) 方法 + +``` +public V put(K key, V value) { + return putVal(hash(key), key, value, false, true); +} + + final V putVal(int hash, K key, V value, boolean onlyIfAbsent, + boolean evict) { + Node[] tab; Node p; int n, i; + if ((tab = table) == null || (n = tab.length) == 0) + n = (tab = resize()).length; + if ((p = tab[i = (n - 1) & hash]) == null)//当前桶为空,没有hash冲突 + tab[i] = newNode(hash, key, value, null); + else { + Node e; K k; + if (p.hash == hash && + ((k = p.key) == key || (key != null && key.equals(k))))//当前桶中的 key、key 的 hashcode 与写入的 key 相等 + e = p; + else if (p instanceof TreeNode)//当前桶为红黑树,那按照红黑树的方式写入数据 + e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value); + else {//链表,就需要将当前的 key、value 封装成一个新节点写入到当前桶的后面 + for (int binCount = 0; ; ++binCount) { + if ((e = p.next) == null) { + p.next = newNode(hash, key, value, null); + if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st + treeifyBin(tab, hash);//判断当前链表的大小是否大于预设的阈值,大于时就要转换为红黑树 + break; + } + if (e.hash == hash && + ((k = e.key) == key || (key != null && key.equals(k))))//在遍历过程中找到 key 相同时直接退出遍历 + break; + p = e; + } + } + if (e != null) { // existing mapping for key + V oldValue = e.value; + if (!onlyIfAbsent || oldValue == null) + e.value = value; + afterNodeAccess(e); + return oldValue; + } + } + ++modCount; + if (++size > threshold)//最后判断是否需要进行扩容 + resize(); + afterNodeInsertion(evict); + return null; + } + +``` ## Hash冲突 HashMap是怎么处理hash碰撞的? - +使用拉链法,为了提高链表查询效率,当桶对应的链表长度大于8的时候,转为红黑树。 ## 扩容 @@ -74,10 +164,12 @@ HashMap是怎么处理hash碰撞的? static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16, 为啥用位运算呢?直接写16不好么? ``` - HashMap的扩容方式? 负载因子是多少? 为什是这么多? -HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。那么问题来了,扩容到多达? 扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? +HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。那么问题来了,扩容到多大? 扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? + +扩容会 rehash,复制数据等耗时操作。 + @@ -90,6 +182,21 @@ HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 ### 多线程下死循环问题 +HashMap 在并发场景下,容易出现死循环 + +``` +final HashMap map = new HashMap(); +for (int i = 0; i < 1000; i++) { + new Thread(new Runnable() { + @Override + public void run() { + map.put(UUID.randomUUID().toString(), ""); + } + }).start(); +} +``` + +在 HashMap 扩容的时候会调用 resize() 方法,就是这里的并发操作容易在一个桶上形成环形链表;这样当获取一个不存在的 key 时,计算出的 index 正好是环形链表的下标就会出现死循环。 diff --git a/3 Hash Table/README.md b/3 Hash Table/README.md index 337e426..6691e94 100644 --- a/3 Hash Table/README.md +++ b/3 Hash Table/README.md @@ -61,7 +61,6 @@ Hash hashCode(char *key){ ## 碰撞解决 -** 负载因子(load factor)** hash 表有一个特性, 随着元素越来越多, 新插入一个元素发生hash冲突的次数就会越来越多, 查找一个元素的速度也会越来越慢。 From 909bdb6a37b59d2fe970c15fde704286f8fbcb1e Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 26 Apr 2021 19:34:13 +0800 Subject: [PATCH 052/151] update hashmap --- 3 Hash Table/HashMap in Java.md | 146 +++++++++++++++++++++++++++++--- 3 Hash Table/README.md | 1 - 2 files changed, 133 insertions(+), 14 deletions(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index e5b80ae..3c918d7 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -3,17 +3,12 @@ java 中 hashmap的实现原理。 -* HashMap底层实现, hashmap的存储结构和操作? -* hashmap的数组长度为什么要保证是2的幂? -* hash冲突如何解决(链表和红黑树)为什么hashmap中的链表需要转成红黑树? -* 扩容时机,什么时候会触发扩容?扩容时避免rehash的优化; -* hashmap扩容时每个entry需要再计算一次hash吗? -* hashmap扩容会引发什么问题,线上是否出现过类似的问题?如何避免扩容引发的问题? -* jdk1.8之前并发操作hashmap时为什么会有死循环的问题? - ## 数据结构 +* HashMap底层实现, hashmap的存储结构和操作? +* hash冲突如何解决(链表和红黑树)? 为什么hashmap中的链表需要转成红黑树? + ``` public class HashMap extends AbstractMap @@ -65,10 +60,12 @@ public class HashMap extends AbstractMap } ``` +table 在第一次put的时候初始化,length默认16, threshold 12 (0.75x16) , 也就是第 13个 元素 put 的时候开始扩容 + 1.7 的实现是 数组+链表; 1.8 新增了红黑树,提高查询效率 -get(key) 方法 +### get(key) 方法 ``` public V get(Object key) { @@ -97,7 +94,7 @@ final Node getNode(int hash, Object key) { ``` -put(key, value) 方法 +### put(key, value) 方法 ``` public V put(K key, V value) { @@ -164,13 +161,111 @@ HashMap是怎么处理hash碰撞的? static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16, 为啥用位运算呢?直接写16不好么? ``` -HashMap的扩容方式? 负载因子是多少? 为什是这么多? +为什么需要扩容? + +主要为缓解哈希冲突造成的外挂链表太长,造成查询性能低下。 + + +HashMap的扩容方式? 负载因子是多少? 扩容时机?什么时候会触发扩容? + +HashMap 中 `final float loadFactor` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。 + +那么问题来了,扩容到多大? 看 resize() 方法 + +``` +final Node[] resize() { + Node[] oldTab = table; + int oldCap = (oldTab == null) ? 0 : oldTab.length; + int oldThr = threshold; + int newCap, newThr = 0; + if (oldCap > 0) { + if (oldCap >= MAXIMUM_CAPACITY) { + threshold = Integer.MAX_VALUE; + return oldTab; + } + else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && + oldCap >= DEFAULT_INITIAL_CAPACITY) + newThr = oldThr << 1; // double threshold + } + else if (oldThr > 0) // initial capacity was placed in threshold + newCap = oldThr; + else { // zero initial threshold signifies using defaults + newCap = DEFAULT_INITIAL_CAPACITY; + newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); + } + if (newThr == 0) { + float ft = (float)newCap * loadFactor; + newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? + (int)ft : Integer.MAX_VALUE); + } + threshold = newThr; + + //创建一个新的 newCap 大小的数组容器,调整table + @SuppressWarnings({"rawtypes","unchecked"}) + Node[] newTab = (Node[])new Node[newCap]; + table = newTab; + if (oldTab != null) { + for (int j = 0; j < oldCap; ++j) { + Node e; + if ((e = oldTab[j]) != null) {//有数据的桶才需要调整 + oldTab[j] = null; + if (e.next == null)//没有链表结构 + newTab[e.hash & (newCap - 1)] = e; + else if (e instanceof TreeNode) + ((TreeNode)e).split(this, newTab, j, oldCap); + else { // preserve order + Node loHead = null, loTail = null; + Node hiHead = null, hiTail = null; + Node next; + do { + next = e.next; + if ((e.hash & oldCap) == 0) {//hash值第 N+1 位是否为0 + if (loTail == null) + loHead = e; + else + loTail.next = e; + loTail = e; + } + else { + if (hiTail == null) + hiHead = e; + else + hiTail.next = e; + hiTail = e; + } + } while ((e = next) != null); + + if (loTail != null) { + loTail.next = null; + newTab[j] = loHead; + } + if (hiTail != null) { + hiTail.next = null; + newTab[j + oldCap] = hiHead; + } + } + } + } + } + return newTab; + } +``` + +扩容到了2倍 `newThr = oldThr << 1; ` + -HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。那么问题来了,扩容到多大? 扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? +扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? 扩容会 rehash,复制数据等耗时操作。 +* hashmap扩容时每个entry需要再计算一次hash吗? + +不需要,但是需要重新调整桶的位置 `newTab[e.hash & (newCap - 1)] = e;` + + +* 扩容时避免rehash的优化; + @@ -182,6 +277,9 @@ HashMap 中 `final float ` , loadFactor 默认 0.75 , 也就是达到容量的 ### 多线程下死循环问题 +* hashmap扩容会引发什么问题,线上是否出现过类似的问题?如何避免扩容引发的问题? +* jdk1.8之前并发操作hashmap时为什么会有死循环的问题? + HashMap 在并发场景下,容易出现死循环 ``` @@ -196,7 +294,29 @@ for (int i = 0; i < 1000; i++) { } ``` -在 HashMap 扩容的时候会调用 resize() 方法,就是这里的并发操作容易在一个桶上形成环形链表;这样当获取一个不存在的 key 时,计算出的 index 正好是环形链表的下标就会出现死循环。 +在 HashMap 扩容的时候会调用 resize() 方法,就是这里的并发操作容易在一个桶上形成环形链表;这样当获取一个不存在的 key 时,计算出的 index 正好是环形链表的下标就会出现死循环。程序临床反应就是 CPU 飙高, 这时候应该使用线程安全的HashMap,也就是 ConcurrentHashMap。 + + + + + +### hashmap的数组长度为什么要保证是2的幂? + + +https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4631373 提出, 整数的除法(/)和 取模(%) 运算 性能比 位与操作(&) 慢10倍。 + + +`h & (length-1)` 和 `h % length` 结果一样 + +举个例子 +``` +hashcode 311 对应的二进制是(1 0011 0111) +length 16 对应的二进制是(1 0000) + +``` + +length 保持为 2 的幂, 那么length-1就会变成一个mask, 它会将hashcode低位取出来,hashcode的低位实际就是余数,和取余操作相比,与操作会将性能提升很多。 + diff --git a/3 Hash Table/README.md b/3 Hash Table/README.md index 6691e94..7738d01 100644 --- a/3 Hash Table/README.md +++ b/3 Hash Table/README.md @@ -64,7 +64,6 @@ Hash hashCode(char *key){ hash 表有一个特性, 随着元素越来越多, 新插入一个元素发生hash冲突的次数就会越来越多, 查找一个元素的速度也会越来越慢。 - 不同的关键字得到同一个散列地址` f(key1)=f(key2) `,即为碰撞 。这是我们需要尽量避免的情况。常见的处理方法有: 1. 拉链法 From 7d1e2970a651fff93470d8110172102c1a489318 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 26 Apr 2021 21:44:25 +0800 Subject: [PATCH 053/151] update hashmap --- 3 Hash Table/HashMap in Java.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 3c918d7..1285ac4 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -311,7 +311,9 @@ https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4631373 提出, 整数的 举个例子 ``` hashcode 311 对应的二进制是(1 0011 0111) -length 16 对应的二进制是(1 0000) +length 16 对应的二进制是(1 0000) , length-1 就是 (0 1111) + +h & (length-1)` 就是取 hashcode 的低 4位 ``` From 2632ed08c3a5d5163774902d32b781454b3e8e10 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 29 Apr 2021 14:03:46 +0800 Subject: [PATCH 054/151] update tree --- .../README.md" | 49 ++++++++++++-- .../\345\255\227\345\205\270\346\240\221.md" | 5 +- "4 Tree/7-B\346\225\260/B\346\240\221.md" | 64 +++++++++++++++++++ .../\347\272\242\351\273\221\346\240\221.md" | 1 - ...53\346\233\274\347\274\226\347\240\201.md" | 3 + 5 Graph/README.md | 4 ++ 6 files changed, 119 insertions(+), 7 deletions(-) diff --git "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" index cacf95a..f901c47 100644 --- "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" +++ "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" @@ -1,9 +1,50 @@ +## 自平衡二叉查找树(AVL tree) + +自平衡二叉查找树(AVL tree): 首先也是二次查找树,其实 任何2个子树的高度差不大于1 +在删除,插入的过程中不断调整子树的高度,保证平均和最坏情况下都是O(logn) + +Adelson-Velskii 和 Landis 1962年 创造。 + +1) 平衡因子 -1 0 1 节点是正常的。平衡因子 = 左子树高度-右字数高度 +2) 除此之外的节点是不平衡的,需要重新平衡这个树。也就是AVL旋转 + + +AVL 实际使用案例 + +* LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树 +* 《一种基于二叉平衡树的P2P覆盖网络的研究》论文 + + + + +## 插入节点 + +a: 左旋转(RR型:节点x的右孩子的右孩子上插入新元素)平衡因子由-1 -》-2 时,需要绕节点x左旋转 +b:右旋转(LL型:节点X的左孩子的左孩子上插入新元素) 平衡因子有1-》2,右旋转 +c: 先左后右旋转:(LR型:树中节点X的左孩子的右孩子上插入新元素) 平衡因子从1变成2后,就需要 先绕X的左子节点Y左旋转,接着再绕X右旋转 +d: 先右后左旋转:(RL型:节点X的右孩子的左孩子上插入新元素) + + + 6 6 6 6 + / \ / \ + 5 7 3 9 + / \ \ / + 3 8 5 7 + (LL型) (RR) (LR) (RL) + + +## 删除节点 + + + + +可以看到,为了保证高度平衡,插入和删除操作代价增加 + + +## AVL 实现过程中的问题 + -### AVL 实现过程中的问题 -### AVL 实际使用案例 - * LLVM 的 ImmutableSet,其底层的实现选择为 AVL 树 - * 《一种基于二叉平衡树的P2P覆盖网络的研究》论文 \ No newline at end of file diff --git "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" index 4526528..5a33c3a 100644 --- "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" +++ "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" @@ -34,9 +34,10 @@ trie树把每个关键字保存在一条路径上,而不是一个节点中 ### trie树存储结构和基本操作 最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符如=-*/) - 子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存 -如果用链表存储,查询时需要遍历链表,查询效率有所降低 +如果用链表存储,查询时需要遍历链表,查询效率有所降低 + + ``` define ALPHABET_NUM 26 diff --git "a/4 Tree/7-B\346\225\260/B\346\240\221.md" "b/4 Tree/7-B\346\225\260/B\346\240\221.md" index 8dfbcb8..b47b461 100644 --- "a/4 Tree/7-B\346\225\260/B\346\240\221.md" +++ "b/4 Tree/7-B\346\225\260/B\346\240\221.md" @@ -14,3 +14,67 @@ 5. 有k个关键字的页节点包含k+1个孩子 也就是说:`根节点到每个叶节点的路径长度都是相同的。` + + + +## 数据结构 + + +``` +typedef struct Item{ + int key; + Data data; +} + +#define m 3 //B树的阶 + + +typedef struct BTNode{ + int degree; //B树的度 + int keynums; //每个节点key的个数 + Item items[m]; + struct BTNode *p[m]; +}BTNode,* BTree; + + +typedef struct{ + BTNode *pt; //指向找到的节点 + int i; // 节点中关键字的序号 (0,m-1) + int tag; //1:查找成功,0:查找失败 +}Result; + + +Status btree_insert(root,target)//插入B树节点 +Result btree_find(root,target)//查找B树节点 +Status btree_delete(root,target)//删除B树节点 +``` + + +## 插入B树节点 + + + + +## 查找B树节点 + + + + +## 删除B树节点 + + + + + + + + + + + + + + + + + diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index 818062d..b12a7a8 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -3,7 +3,6 @@ ### 应用场景 - java 中 HashMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 关于 HashMap 实现解析参考 [这里](.../Hash Table/HashMap in Java.md) diff --git "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" index b121e98..8e641a6 100644 --- "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" +++ "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" @@ -46,4 +46,7 @@ struct node{ 1. 读取文件头 2. 遍历编码后的bits,从赫夫曼树的根节点出发,遇到0,进入左子树,遇到1进入右子树,直到叶节点 + + + diff --git a/5 Graph/README.md b/5 Graph/README.md index 259cfff..7fe21e1 100644 --- a/5 Graph/README.md +++ b/5 Graph/README.md @@ -63,3 +63,7 @@ A* ### 参考 https://www.jiqizhixin.com/articles/2019-05-16-14 + + + + From 0824018756624f99436611e24aa35c46ff4d49b9 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 14 Jul 2021 00:20:45 +0800 Subject: [PATCH 055/151] udpate hashmap --- 3 Hash Table/HashMap in Java.md | 46 +++++++++++++++++-- .../AVLTree.c" | 29 ------------ 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 1285ac4..5db7725 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -10,6 +10,10 @@ java 中 hashmap的实现原理。 * hash冲突如何解决(链表和红黑树)? 为什么hashmap中的链表需要转成红黑树? +好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。 + + + ``` public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { @@ -96,6 +100,9 @@ final Node getNode(int hash, Object key) { ### put(key, value) 方法 + +hash存储的过程是: key -> hashcode -> hash -> indexFor() + ``` public V put(K key, V value) { return putVal(hash(key), key, value, false, true); @@ -103,6 +110,7 @@ public V put(K key, V value) { final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { + Node[] tab; Node p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; @@ -147,6 +155,17 @@ public V put(K key, V value) { ``` +``` +//返回数组下标 +static int indexFor(int h, int length) { + return h & (length-1); +} +``` + +这里用的位运行,而不是取模操作; 位运算性能更高。 + + + ## Hash冲突 HashMap是怎么处理hash碰撞的? @@ -161,12 +180,12 @@ HashMap是怎么处理hash碰撞的? static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16, 为啥用位运算呢?直接写16不好么? ``` -为什么需要扩容? +### 为什么需要扩容? 主要为缓解哈希冲突造成的外挂链表太长,造成查询性能低下。 -HashMap的扩容方式? 负载因子是多少? 扩容时机?什么时候会触发扩容? +### HashMap的扩容方式? 负载因子是多少? 扩容时机?什么时候会触发扩容? HashMap 中 `final float loadFactor` , loadFactor 默认 0.75 , 也就是达到容量的 75%时就会开始扩容。 @@ -255,7 +274,8 @@ final Node[] resize() { -扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? +### 扩容后元素怎么重排到新的容器中,直接复制拷贝可以吗? + 扩容会 rehash,复制数据等耗时操作。 @@ -271,6 +291,14 @@ final Node[] resize() { ## 问题 + +### JDK7 和 8 HashMap 有什么区别? + +* JDK8 实现引入红黑树,优化链表过长的查询效率 +* 1.7 采用头插法,1.8采用尾插法 + + + ### 链表上使用的头插还是尾插方式? @@ -319,6 +347,18 @@ h & (length-1)` 就是取 hashcode 的低 4位 length 保持为 2 的幂, 那么length-1就会变成一个mask, 它会将hashcode低位取出来,hashcode的低位实际就是余数,和取余操作相比,与操作会将性能提升很多。 +另外,hash扩容时 rehash 操作,只有 hash二进制 高位是 1 的hash key 需要 移动到新的 slot (pos + oldCap), 高位是 0 的 key 不需要移动 + +![hashmap rehash](https://pic3.zhimg.com/80/v2-ed0ca17db342562dfc18434d12227be2_720w.jpg) + + + + + + + + + diff --git "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" index 2dc947f..dd1cc3c 100644 --- "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" +++ "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" @@ -1,35 +1,6 @@ /* -自平衡二叉查找树(AVL tree): 首先也是二次查找树,其实 任何2个子树的高度差不大于1 -在删除,插入的过程中不断调整子树的高度,保证平均和最坏情况下都是O(logn) -Adelson-Velskii 和 Landis 1962年 创造。 - -1) 平衡因子 -1 0 1 节点是正常的。平衡因子 = 左子树高度-右字数高度 -2) 除此之外的节点是不平衡的,需要重新平衡这个树。也就是AVL旋转 - -插入节点: - -a: 左旋转(RR型:节点x的右孩子的右孩子上插入新元素)平衡因子由-1 -》-2 时,需要绕节点x左旋转 -b:右旋转(LL型:节点X的左孩子的左孩子上插入新元素) 平衡因子有1-》2,右旋转 -c: 先左后右旋转:(LR型:树中节点X的左孩子的右孩子上插入新元素) 平衡因子从1变成2后,就需要 先绕X的左子节点Y左旋转,接着再绕X右旋转 -d: 先右后左旋转:(RL型:节点X的右孩子的左孩子上插入新元素) - - - 6 6 6 6 - / \ / \ - 5 7 3 9 - / \ \ / - 3 8 5 7 - (LL型) (RR) (LR) (RL) - - -删除节点: - - - - -可以看到,为了保证高度平衡,插入和删除操作代价增加 记于2014-2-28 by @nonstriater */ From 8c9fc66754bfbc9efcf392abdb448ab0986b2466 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 14 Jul 2021 00:59:09 +0800 Subject: [PATCH 056/151] update hashmap --- 3 Hash Table/HashMap in Java.md | 39 ++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 5db7725..4fa6590 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -98,6 +98,23 @@ final Node getNode(int hash, Object key) { ``` + +``` +//计算hash值 +//这是一个神奇的函数,用了很多的异或,移位等运算,对key的hashcode进一步进行计算以及二进制位的调整等来保证最终获取的存储位置尽量分布均匀 +final int hash(Object k) { + int h = hashSeed; + if (0 != h && k instanceof String) { + return sun.misc.Hashing.stringHash32((String) k); + } + + h ^= k.hashCode(); + + h ^= (h >>> 20) ^ (h >>> 12); + return h ^ (h >>> 7) ^ (h >>> 4); + } +``` + ### put(key, value) 方法 @@ -166,6 +183,9 @@ static int indexFor(int h, int length) { + + + ## Hash冲突 HashMap是怎么处理hash碰撞的? @@ -284,7 +304,7 @@ final Node[] resize() { 不需要,但是需要重新调整桶的位置 `newTab[e.hash & (newCap - 1)] = e;` -* 扩容时避免rehash的优化; +* 扩容时避免rehash的优化 : cap 为 2 的次幂,rehash也是 cap * 2 , 这样可以 `e.hash & (newCap - 1)` 计算时,有较少的 key 产生移动,hash值 高位 1 的 才需要移动 @@ -295,12 +315,14 @@ final Node[] resize() { ### JDK7 和 8 HashMap 有什么区别? * JDK8 实现引入红黑树,优化链表过长的查询效率 -* 1.7 采用头插法,1.8采用尾插法 +* 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap) ### 链表上使用的头插还是尾插方式? +1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 + ### 多线程下死循环问题 @@ -327,7 +349,6 @@ for (int i = 0; i < 1000; i++) { - ### hashmap的数组长度为什么要保证是2的幂? @@ -353,9 +374,21 @@ length 保持为 2 的幂, 那么length-1就会变成一个mask, 它会将hash +### 重写equals方法需同时重写hashCode方法 +``` +public static void main(String []args){ + HashMap map = new HashMap(); + Person person = new Person(1234,"乔峰"); + //put到hashmap中去 + map.put(person,"天龙八部"); + //get取出,从逻辑上讲应该能输出“天龙八部” + System.out.println("结果:"+map.get(new Person(1234,"萧峰"))); +} +``` +hashCode()的默认行为是对堆上的对象产生独特值。因此 map.get(object) 的时候,不同的 object 的hashcode 不一样,自然结果就为null From e5deb6763eff556e4863ed3aed073e4ff68cbfc7 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 14 Jul 2021 10:54:17 +0800 Subject: [PATCH 057/151] add LinkedHashMap --- 3 Hash Table/LinkedHashMap.md | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 3 Hash Table/LinkedHashMap.md diff --git a/3 Hash Table/LinkedHashMap.md b/3 Hash Table/LinkedHashMap.md new file mode 100644 index 0000000..92ec49f --- /dev/null +++ b/3 Hash Table/LinkedHashMap.md @@ -0,0 +1,88 @@ +# LinkedHashMap + +java 中 LinkedHashmap的实现原理。LinkedHashmap继承自 HashMap。 + +HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致。 迭代顺序与插入顺序一致,这种叫做 插入有序。 + +#### 特点 + +* 维护一个所有entry的双向链表 +* accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); 其中,访问顺序比较适合做 LRU 缓存 + + +#### 引用场景 + +* LUR 缓存 (最近最少使用) + + +## 原理 + + +``` +public class LinkedHashMap + extends HashMap + implements Map { + + static class Entry extends HashMap.Node { + Entry before, after; + Entry(int hash, K key, V value, Node next) { + super(hash, key, value, next); + } + } + + transient LinkedHashMap.Entry head; + + transient LinkedHashMap.Entry tail; + + } +``` + + +## 用LinkedHashMap实现LRU + + +构造函数如下 + +``` +public LinkedHashMap(int initialCapacity, + float loadFactor, + boolean accessOrder) { + super(initialCapacity, loadFactor); + this.accessOrder = accessOrder; + } +``` + +accessOrder 是访问顺序,默认为插入顺序(false), true 代表访问顺序。 + + +访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。 这个特性非常适合 LRU 缓存 (最近最少使用) ; + +插入逻辑,运行自定义删除最老entry的逻辑 + +``` +void afterNodeInsertion(boolean evict) { // possibly remove eldest + LinkedHashMap.Entry first; + if (evict && (first = head) != null && removeEldestEntry(first)) { + K key = first.key; + removeNode(hash(key), key, null, false, true); + } +} +``` + + +重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。 + +``` +private static final int MAX_ENTRIES = 100; +protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_ENTRIES; +} +``` + + + + + + + + From d8eeb9b7bb7e913563166e6e0535eab2d0fe4b33 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 20 Jul 2021 17:57:12 +0800 Subject: [PATCH 058/151] add treeMap --- 3 Hash Table/TreeMap in Java.md | 75 +++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 3 Hash Table/TreeMap in Java.md diff --git a/3 Hash Table/TreeMap in Java.md b/3 Hash Table/TreeMap in Java.md new file mode 100644 index 0000000..485d911 --- /dev/null +++ b/3 Hash Table/TreeMap in Java.md @@ -0,0 +1,75 @@ +# TreeMap in Java + + +java 中 TreeMap的实现原理。 + + + +#### 特点 + +* 有序的Key-value 集合,通过红黑树实现; +* 遍历时元素按照键key的自然顺序进行排序,也可以创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法 +* TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) + + + +#### 引用场景 + +* 一致性Hash算法 + + + +## 使用 + +``` +//创建TreeMap对象: +TreeMap treeMap = new TreeMap(); + + //新增元素: + treeMap.put("hello",1); + treeMap.put("world",2); + treeMap.put("my",3); + treeMap.put("name",4); + + +//遍历元素, 按照key排序 + Set> entrySet = treeMap.entrySet(); + for(Map.Entry entry : entrySet){ + String key = entry.getKey(); + Integer value = entry.getValue(); + System.out.println("TreeMap元素的key:"+key+",value:"+value); + } + +String firstKey = treeMap.firstKey();//获取集合内第一个元素 + +String lastKey =treeMap.lastKey();//获取集合内最后一个元素 + +String lowerKey =treeMap.lowerKey("jiaboyan");//获取集合内的key小于"jiaboyan"的第一个key + +String ceilingKey =treeMap.ceilingKey("jiaboyan");//获取集合内的key大于等于"jiaboyan"的第一个key + +``` + +## 原理 + + +参考 ![红黑树](../Tree/9-红黑树\ R-B\ tree/红黑树.md) + + +## 应用 + + + +### 一致性Hash算法 + +一致性Hash算法解决的问题是: 数据均匀的分片存储在不同的机器节点上,且在机器节点上发送增删时 (扩容或者缩容时) ,最少数据集的映射(rehash) 规则发生改变。 + +简单说下原理: + + + + + + + + From cd284e7d231319e9d771f95ce98b99b549506837 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 20 Jul 2021 18:03:18 +0800 Subject: [PATCH 059/151] update Treemap --- 3 Hash Table/TreeMap in Java.md | 2 +- .../\347\272\242\351\273\221\346\240\221.md" | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3 Hash Table/TreeMap in Java.md b/3 Hash Table/TreeMap in Java.md index 485d911..7177f40 100644 --- a/3 Hash Table/TreeMap in Java.md +++ b/3 Hash Table/TreeMap in Java.md @@ -53,7 +53,7 @@ String ceilingKey =treeMap.ceilingKey("jiaboyan");//获取集合内的key大于 ## 原理 -参考 ![红黑树](../Tree/9-红黑树\ R-B\ tree/红黑树.md) +参考 [红黑树](../Tree/9-红黑树\ R-B\ tree/红黑树.md) ## 应用 diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index b12a7a8..054a499 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -3,8 +3,8 @@ ### 应用场景 -java 中 HashMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 -关于 HashMap 实现解析参考 [这里](.../Hash Table/HashMap in Java.md) +java 中 HashMap、TreeMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 +关于 HashMap 实现解析参考 [这里](.../Hash\ Table/HashMap\ in\ Java.md) From c6449f8ce9eafde414edf134cc634b983ab2d533 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 20 Jul 2021 18:30:29 +0800 Subject: [PATCH 060/151] update treemap --- 3 Hash Table/TreeMap in Java.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/3 Hash Table/TreeMap in Java.md b/3 Hash Table/TreeMap in Java.md index 7177f40..540abb6 100644 --- a/3 Hash Table/TreeMap in Java.md +++ b/3 Hash Table/TreeMap in Java.md @@ -66,7 +66,39 @@ String ceilingKey =treeMap.ceilingKey("jiaboyan");//获取集合内的key大于 简单说下原理: +treeMap 中 key 是 机器节点node 的 hash值, value 是机器节点 IP:port ; 使用TreeMap的 ceilingKey(hash) 这个 API 可以获得 第一个大于 这个 hash值的 节点 +``` +public class Demo { + + private static String[] servers = {“ip1”, “1p2”, “ip3"}; + + private TreeMap treeMap; // + + /* 一个数据key,会被分片到哪个机器上 */ + public String shardingServer(String key) { + + int dataHash = hash(key); + + //怎么找大于 data_hash 值 的第一个节点? 借助 TreeMap 结构 + String node = getServer(dataHash) + + return node; + } + + /* hash 函数*/ + public int hash(String key){ + + } + + //寻找第一个大于 hash 值的 node + private String getServer(String hash) { + + return treeMap.ceilingKey(hash) + } + +} +``` From 98cfe8b82d40826ad03936c52c1c41aaa3f07efd Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 22 Jul 2021 14:53:14 +0800 Subject: [PATCH 061/151] update hashMap --- 3 Hash Table/LinkedHashMap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3 Hash Table/LinkedHashMap.md b/3 Hash Table/LinkedHashMap.md index 92ec49f..1144974 100644 --- a/3 Hash Table/LinkedHashMap.md +++ b/3 Hash Table/LinkedHashMap.md @@ -7,7 +7,7 @@ HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致 #### 特点 * 维护一个所有entry的双向链表 -* accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); 其中,访问顺序比较适合做 LRU 缓存 +* 构造函数 有一个 accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); 其中,访问顺序比较适合做 LRU 缓存 #### 引用场景 From 5ed1c8b1653fd028c239eaaa6b829fb7320705d1 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 22 Jul 2021 15:52:03 +0800 Subject: [PATCH 062/151] add ziplist --- 2 List/ZipList.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 2 List/ZipList.md diff --git a/2 List/ZipList.md b/2 List/ZipList.md new file mode 100644 index 0000000..7e60a88 --- /dev/null +++ b/2 List/ZipList.md @@ -0,0 +1,25 @@ +# ZipList + + +ZipList 压缩列表 redis 中的 sset(有序集合) 使用跳表来实现,为什么不是用红黑树,而是跳表实现sset,带着这样的疑问,有了本文。 + + +## 跳表理解 + + +有哪些应用场景? + + +## 跳表的结构 + + + + +## 插入,删除,查找 实现 + + + +## sset 为什么使用 跳表 + + + From 3315c86c10a464556746a7bd7714389a8590d407 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 13:09:06 +0800 Subject: [PATCH 063/151] update dir --- 2 List/ZipList.md | 11 +++-- ...1 \345\255\227\347\254\246\344\270\262.md" | 0 .../2 \351\223\276\350\241\250.md" | 43 +++++++++++++------ ...3 \345\240\206\345\222\214\346\240\210.md" | 2 +- ...60\345\200\274\351\227\256\351\242\230.md" | 0 ...60\345\210\227\351\227\256\351\242\230.md" | 0 .../6 \347\237\251\351\230\265.md" | 0 ...7 \344\272\214\345\217\211\346\240\221.md" | 0 .../8 \345\233\276.md" | 0 ...35\347\273\264\350\256\255\347\273\203.md" | 0 ...73\347\273\237\350\256\276\350\256\241.md" | 0 9 Algorithms Job Interview/README.md | 3 ++ 9 Algorithms Job Interview/leetcode.md | 13 ------ .../\344\271\235\345\272\246OJ.md" | 5 --- ...60\346\215\256\345\244\204\347\220\206.md" | 0 15 files changed, 41 insertions(+), 36 deletions(-) rename "9 Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" => "9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" (100%) rename "9 Algorithms Job Interview/\351\223\276\350\241\250.md" => "9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" (91%) rename "9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" => "9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" (99%) rename "9 Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" => "9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" (100%) rename "9 Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" => "9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" (100%) rename "9 Algorithms Job Interview/\347\237\251\351\230\265.md" => "9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" (100%) rename "9 Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" => "9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" (100%) rename "9 Algorithms Job Interview/\345\233\276.md" => "9 Algorithms Job Interview/8 \345\233\276.md" (100%) rename "9 Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" => "9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" (100%) rename "9 Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" => "9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" (100%) delete mode 100644 9 Algorithms Job Interview/leetcode.md delete mode 100644 "9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" rename "9 Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" => "91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" (100%) diff --git a/2 List/ZipList.md b/2 List/ZipList.md index 7e60a88..3763ad2 100644 --- a/2 List/ZipList.md +++ b/2 List/ZipList.md @@ -4,13 +4,19 @@ ZipList 压缩列表 redis 中的 sset(有序集合) 使用跳表来实现,为什么不是用红黑树,而是跳表实现sset,带着这样的疑问,有了本文。 -## 跳表理解 +## 理解 有哪些应用场景? -## 跳表的结构 + +#### 为什么使用 + + + + +## 结构 @@ -19,7 +25,6 @@ ZipList 压缩列表 redis 中的 sset(有序集合) 使用跳表来实现,为 -## sset 为什么使用 跳表 diff --git "a/9 Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" similarity index 100% rename from "9 Algorithms Job Interview/\345\255\227\347\254\246\344\270\262.md" rename to "9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" diff --git "a/9 Algorithms Job Interview/\351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" similarity index 91% rename from "9 Algorithms Job Interview/\351\223\276\350\241\250.md" rename to "9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index a521e95..137a8ae 100644 --- "a/9 Algorithms Job Interview/\351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -8,7 +8,7 @@ * 2个链表合并 -#### 判断俩个链表是否相交 +## 判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。 @@ -18,16 +18,17 @@ 2.如果需要求出俩个链表相交的第一个节点列? -#### 输出两个非降序链表的并集 +## 输出两个非降序链表的并集 请修改append函数,利用这个函数实现: 两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5 。另外只能输出结果,不能修改两个链表的数据。 -#### 输出链表中倒数第k个结点 +## 输出链表中倒数第k个结点 题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 + 链表结点定义如下: struct ListNode { @@ -36,7 +37,7 @@ struct ListNode }; -#### 链表排序 +## 链表排序 Given a head pointer pointing to a linked list ,please write a function that sort the list in increasing order. You are not allowed to use temporary array or memory copy (微软面试题) @@ -52,7 +53,7 @@ Node * sort_link_list_increasing_order (Node *pheader): ``` -#### 给定单链表,检测是否有环。 +## 给定单链表,检测是否有环。 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 @@ -75,7 +76,7 @@ p->next=NULL。此时,原单链表可以看作两条单链表,一条从head 于是运用题二的方法,我们找到它们的第一个交点即为所求。 -#### 删除链表中的p节点 +## 删除链表中的p节点 只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。 @@ -86,13 +87,13 @@ p->next=NULL。此时,原单链表可以看作两条单链表,一条从head 接下来将p中的数据copy入q中,然后再将要插入的数据记录在p中。都可以做到0(1)复杂度 -#### 链表反转 +## 链表反转 三个指针,遍历一遍(0(n)复杂度 -#### 复杂链表的复制 +## 复杂链表的复制 题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外, 还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: @@ -110,7 +111,7 @@ p->next=NULL。此时,原单链表可以看作两条单链表,一条从head -#### 找出两个链表的第一个公共结点 +## 找出两个链表的第一个公共结点 题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为: ``` @@ -131,7 +132,7 @@ struct ListNode -#### 从尾到头输出链表 +## 从尾到头输出链表 输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下: @@ -147,7 +148,7 @@ struct ListNode{ 思路三: 递归实现,将printf语句放在递归调用后面。果然妙极。。 -#### 在O(1)时间内删除链表结点 +## 在O(1)时间内删除链表结点 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: ``` @@ -165,25 +166,26 @@ void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 保存下一个节点的值tmp,删除下一个节点,当前节点=tmp -#### 将两链表中data值相同的结点删除 +## 将两链表中data值相同的结点删除 有双向循环链表结点定义为: + ``` struct node{ int data; struct node *front,*next; }; -```` +``` 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。 -#### 链表和数组的区别在哪里? +## 链表和数组的区别在哪里? 分析:主要在基本概念上的理解。 但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生, @@ -191,3 +193,16 @@ struct node{ + + + + + + + + + + + + + diff --git "a/9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" similarity index 99% rename from "9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" rename to "9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" index 926492e..5546d04 100644 --- "a/9 Algorithms Job Interview/\345\240\206\345\222\214\346\240\210.md" +++ "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" @@ -1,5 +1,5 @@ -##堆和栈 +# 堆和栈 栈的数据结构 diff --git "a/9 Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" similarity index 100% rename from "9 Algorithms Job Interview/\346\225\260\345\200\274\351\227\256\351\242\230.md" rename to "9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" diff --git "a/9 Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" similarity index 100% rename from "9 Algorithms Job Interview/\346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" rename to "9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" diff --git "a/9 Algorithms Job Interview/\347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" similarity index 100% rename from "9 Algorithms Job Interview/\347\237\251\351\230\265.md" rename to "9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" diff --git "a/9 Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" similarity index 100% rename from "9 Algorithms Job Interview/\344\272\214\345\217\211\346\240\221.md" rename to "9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" diff --git "a/9 Algorithms Job Interview/\345\233\276.md" "b/9 Algorithms Job Interview/8 \345\233\276.md" similarity index 100% rename from "9 Algorithms Job Interview/\345\233\276.md" rename to "9 Algorithms Job Interview/8 \345\233\276.md" diff --git "a/9 Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" "b/9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" similarity index 100% rename from "9 Algorithms Job Interview/\346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" rename to "9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" diff --git "a/9 Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" "b/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" similarity index 100% rename from "9 Algorithms Job Interview/\347\263\273\347\273\237\350\256\276\350\256\241.md" rename to "9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index 21dbcb7..d63cebd 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -100,6 +100,9 @@ +[九度OJ](http://ac.jobdu.com/index.php) +[leetcode 题目](https://leetcode.com/) + diff --git a/9 Algorithms Job Interview/leetcode.md b/9 Algorithms Job Interview/leetcode.md deleted file mode 100644 index 634b1fb..0000000 --- a/9 Algorithms Job Interview/leetcode.md +++ /dev/null @@ -1,13 +0,0 @@ - -题目来自[leetcode](https://leetcode.com/) - - -[LeetCode题解C++版](https://github.com/soulmachine/leetcode), 151道题完整版 - -#### Minimum Height Trees - - - -#### Additive Number - - diff --git "a/9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" "b/9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" deleted file mode 100644 index b8f5dca..0000000 --- "a/9 Algorithms Job Interview/\344\271\235\345\272\246OJ.md" +++ /dev/null @@ -1,5 +0,0 @@ - -题目来自 [九度OJ](http://ac.jobdu.com/index.php) - - - diff --git "a/9 Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" rename to "91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" From 936d401a85ad759fce43dcb13f0386fe115dccc2 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 13:27:19 +0800 Subject: [PATCH 064/151] update dir --- ...1 \345\255\227\347\254\246\344\270\262.md" | 71 ++++++------ ...3 \345\240\206\345\222\214\346\240\210.md" | 8 +- ...60\345\200\274\351\227\256\351\242\230.md" | 52 ++++----- ...60\345\210\227\351\227\256\351\242\230.md" | 109 +++++++++--------- .../6 \347\237\251\351\230\265.md" | 11 +- ...7 \344\272\214\345\217\211\346\240\221.md" | 24 ++-- ...35\347\273\264\350\256\255\347\273\203.md" | 10 +- 7 files changed, 140 insertions(+), 145 deletions(-) diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index fedd6ba..a038344 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -10,7 +10,7 @@ * 子串 -#### 翻转句子中单词的顺序 +## 翻转句子中单词的顺序 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。 @@ -79,7 +79,7 @@ char *revert_by_word(char *source){ 用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 -#### 左旋转字符串 +## 左旋转字符串 >字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 @@ -93,7 +93,7 @@ char *left_rotate(char *str,int offset){ 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了,也就是跟上面的问题是同样的问题。 -#### 判断字符串是否是回文 +## 判断字符串是否是回文 分析: 2个指针,一头一尾,逐个比较,都相同就是回文 @@ -124,7 +124,7 @@ int is_huiwen(const char *source){ ``` -#### 只出现一次的字符 +## 找到第一个只出现一次的字符 在一个字符串中找到第一个只出现一次的字符。如输入ahbaccdeff,则输出h。 @@ -163,7 +163,7 @@ char char_first_appear_once(const unsigned char *source){ 题目扩展:这里的字符换成整数,整数数量几十TB,海量数据处理,显然hash方法不可能,没有那么大得内容 -#### 统计文章里单词出现的次数 +## 统计文章里单词出现的次数 设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词,按照在文章中首次出现的顺序打印输出该单词和它的出现次数。 @@ -178,7 +178,7 @@ void statistics(FILE *fd) 如果是海量数据里面统计top-k次数的单词呢? -#### 替换空格 +## 替换空格 实现一个函数,把每个空格替换成 "%20",如输入“we are happy”,则输出“we%20are%20happy” @@ -220,7 +220,7 @@ char *replace_blank(char *source){ ``` -#### 小写字母排在大写字母的前面 +## 小写字母排在大写字母的前面 有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型: @@ -266,21 +266,21 @@ char *proc(char *str){ } ``` -#### 实现字符串转整型的函数 +## 实现字符串转整型的函数 也就是实现函数atoi的功能,这道题目考查的就是对各种情况下异常处理。比如: 以"213"分析转换成证书的过程。3+1x10+2x100,思路是:每扫描到一个字符,把之前得到的数字*10,再加上当前的数字 -0开头,"0213" -正/负数,"-432" ,"--422","++23" -浮点数,"43.2344" -非法,"2123des" -存在空格," -32"," +432"," 234","23 432","353 "," + 321" -NULL/空串,这时候返回值0 -溢出,"32111111112222222222222222222222222222222" , 与 `INT_MAX `比较 +* 0开头,"0213" +* 正/负数,"-432" ,"--422","++23" +* 浮点数,"43.2344" +* 非法,"2123des" +* 存在空格," -32"," +432"," 234","23 432","353 "," + 321" +* NULL/空串,这时候返回值0 +* 溢出,"32111111112222222222222222222222222222222" , 与 `INT_MAX `比较 +* 如何区分正常的'0'和异常情况下返回的结果"0"? 可以通过一个全局变量 g_status 来标示,值为 kValid/kInvalid。 -如何区分正常的'0'和异常情况下返回的结果"0"? 可以通过一个全局变量 g_status 来标示,值为 kValid/kInvalid。 ``` @@ -292,7 +292,7 @@ int atoi(const char *str){ 详细过程也可以[参考这里](http://blog.csdn.net/v_july_v/article/details/9024123) -#### 删除串中指定的字符 +## 删除串中指定的字符 删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是O(N^2);那么有没有O(N)的方法呢? @@ -318,7 +318,7 @@ char *delete_occurence_character(char *src , char target){ ``` -#### 在字符串中删除特定的字符 +## 在字符串中删除特定的字符 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。 @@ -333,7 +333,7 @@ char *delete_occurence_characterset(char *source,const char *del); -#### 删除字符串中的数字并压缩字符串 +## 删除字符串中的数字并压缩字符串 如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N)) 这道题跟上一道题也是一个意思。 @@ -360,7 +360,7 @@ char *trim_number(char *source){ -#### 字符串原地压缩 +## 字符串原地压缩 题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 @@ -384,7 +384,7 @@ char *compress(const char *src,char *dest){ -#### 字符串中找出连续最长的数字串 +## 字符串中找出连续最长的数字串 写一个函数,功能: @@ -451,13 +451,13 @@ int longest_continuious_number(const char *input,char *output){ -#### 求最大连续递增数字串 +## 求最大连续递增数字串 如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。 -#### 最长公共子串问题 +## 最长公共子串问题 请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 @@ -481,7 +481,7 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){ -#### 对称子字符串的最大长度 +## 对称子字符串的最大长度 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 @@ -491,13 +491,10 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){ int max_symmetrical_char_length(const char *scr); ``` -思路一:蛮力法,3重循环(类似 求子数组的最大和 fmax(i,j)问题), fmax(i,j)区间i,j是最长的对称字符 -思路二:遍历所有子串,然后判读是否对称 O(n^2) -思路三:有个O(n)复杂度的算法 http://www.cnblogs.com/McQueen1987/p/3559497.html 分析过程如下: +* 思路一:蛮力法,3重循环(类似 求子数组的最大和 fmax(i,j)问题), fmax(i,j)区间i,j是最长的对称字符 +* 思路二:遍历所有子串,然后判读是否对称 O(n^2) +* 思路三:有个O(n)复杂度的算法 http://www.cnblogs.com/McQueen1987/p/3559497.html 分析过程如下: -1. -2. -3. ``` int max_symmetrical_char_length(const char *scr){ @@ -507,7 +504,7 @@ int max_symmetrical_char_length(const char *scr){ -#### 子串匹配的个数 +## 子串匹配的个数 已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,如果没有返回0,有的话返回子字符串的个数。 @@ -517,7 +514,7 @@ char *substr_count(const char *src, const char *substr, int *count) -#### 请编写能直接实现strstr()函数功能的代码。 +## 请编写能直接实现strstr()函数功能的代码。 > strstr(str1,str2) 判断str2是否是str1的子串。 @@ -531,7 +528,7 @@ char *strstr(const char *source, const char *target){ ``` -#### 匹配兄弟字符串 +## 匹配兄弟字符串 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。 @@ -556,7 +553,7 @@ int isBrother(const char *first,const char *secd){ -#### 字符串的排列 +## 字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。输入字符串 abcca,则输出由 a,b,c排列出来的所有字符串,字符出现个数不变 @@ -569,21 +566,21 @@ int isBrother(const char *first,const char *secd){ -#### n个字符串联接 +## n个字符串联接 有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。 -#### 字符串的集合合并 +## 字符串的集合合并 给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。 -#### 编写strcpy 函数 +## 编写strcpy 函数 已知strcpy 函数的原型是: ``` diff --git "a/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" index 5546d04..b26f180 100644 --- "a/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" +++ "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" @@ -46,7 +46,7 @@ void dequeue(Queue); 这里的题目是有关栈和队列的问题。 -#### 循环队列中元素个数 +## 循环队列中元素个数 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列头到队列尾的元素个数(包含队列头、队列尾) @@ -67,7 +67,7 @@ else -#### 设计包含min函数的栈 +## 设计包含min函数的栈 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 @@ -86,7 +86,7 @@ a < f(top),把 a push 到 辅助栈中 -#### 栈的push、pop序列 +## 栈的push、pop序列 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 @@ -114,7 +114,7 @@ a < f(top),把 a push 到 辅助栈中 -#### 颠倒栈 +## 颠倒栈 题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 74bc07f..8544f52 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -6,7 +6,7 @@ * 大数问题 -#### 求1+2+…+n +## 求1+2+…+n 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 @@ -23,7 +23,7 @@ int factorial(n){ ``` -#### 整数的二进制表示中1的个数 +## 整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 @@ -48,7 +48,7 @@ int one_appear_count_by_binary(int num){ ``` -#### 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 +## 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 分析: ``` @@ -63,7 +63,7 @@ int one_appear_count_by_binary(int num){ ``` -#### 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列 +## 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列 分析: ``` @@ -78,7 +78,7 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; -#### 判断一个自然数是否是某个数的平方 +## 判断一个自然数是否是某个数的平方 说明:当然不能使用开方运算。 @@ -103,7 +103,7 @@ int is_powered(int num) ``` -#### 1024! 末尾有多少个0? +## 1024! 末尾有多少个0? 分析: 末尾0的个数取决于2和5的个数 @@ -111,7 +111,7 @@ int is_powered(int num) -#### 编程实现两个正整数的除法(和取模) +## 编程实现两个正整数的除法(和取模) 编程实现两个正整数的除法,当然不能用除法操作符。 ``` @@ -125,14 +125,13 @@ int div(const int x, const int y) -#### 求两个或N个数的最大公约数和最小公倍数。 +## 求两个或N个数的最大公约数和最小公倍数。 +## 大整数乘法(或 大整数阶乘) -#### 大整数乘法(或 大整数阶乘) - -请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321 。 +请使用代码计算`1234567891011121314151617181920*2019181716151413121110987654321` 。 1. 注意结果可能超出长整形的最大范围 2^64-1 2. 采用分治算法,将大整数相乘转换为小整数计算 @@ -141,11 +140,11 @@ int div(const int x, const int y) -#### 两个数相乘,小数点后位数没有限制,请写一个高精度算法 +## 两个数相乘,小数点后位数没有限制,请写一个高精度算法 -#### 数值的整数次方 +## 数值的整数次方 题目:实现函数`double Power(double base, int exponent)`,求base的exponent次方。 @@ -166,7 +165,7 @@ double Power(double base, int exponent) 上面的代码没有考虑: exponent<=0 判断一个浮点数是不是等于0时,不是直接写 base == 0 ,而应该判断它们的差的绝对值是不是小于一个很小的范围 -如果指数大于0,我们还可以使用递归实现:a^n = a^(n/2)*a^(n/2) (n为偶数), 通过这个思路也可以实现 +如果指数大于0,我们还可以使用递归实现:`a^n = a^(n/2)*a^(n/2)` (n为偶数), 通过这个思路也可以实现 ``` 2^16 = 2^8 * 2^8 2^8 = 2^4 * 2^4 @@ -176,6 +175,7 @@ double Power(double base, int exponent) ``` 用例: + ``` 2 3 = 8 0 3 = 0 @@ -201,7 +201,7 @@ double Power(double base, unsigned int exponent) ``` -#### 求根号2的值 +## 求根号2的值 并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 @@ -211,7 +211,7 @@ double Power(double base, unsigned int exponent) -#### 整数的素数和分解问题 +## 整数的素数和分解问题 歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。 对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。 @@ -229,7 +229,7 @@ double Power(double base, unsigned int exponent) ``` -#### 大于K的最小正整数 +## 大于K的最小正整数 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 @@ -237,16 +237,16 @@ double Power(double base, unsigned int exponent) -#### 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。 +## 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。 -#### 设计一个随机算法 +## 设计一个随机算法 给你5个球,每个球被抽到的可能性为30、50、20、40、10,设计一个随机算法,该算法的输出结果为本次执行的结果。输出A,B,C,D,E即可。 -#### 构造一个随机发生器 +## 构造一个随机发生器 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器, 使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;..., @@ -255,14 +255,14 @@ double Power(double base, unsigned int exponent) -#### 两个圆相交 +## 两个圆相交 两个圆相交,交点是A1,A2。现在过A1点做一直线与两个圆分别相交另外一点B1,B2。B1B2可以绕着A1点旋转。问在什么情况下,B1B2最长 -#### 输入四个点的坐标,求证四个点是不是一个矩形 +## 输入四个点的坐标,求证四个点是不是一个矩形 关键点: 1.相邻两边斜率之积等于-1, @@ -272,15 +272,15 @@ double Power(double base, unsigned int exponent) -#### 排列组合问题 +## 排列组合问题 -##### 1,2,3,4,5 五个不同的数字,打印不同的排列。这就是一个无向图的遍历,把每个数字看成一个节点。 +## 1,2,3,4,5 五个不同的数字,打印不同的排列。这就是一个无向图的遍历,把每个数字看成一个节点。 -##### 用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, +## 用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, -如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连. +如:512234、412345 等,要求:"4"不能在第三位,"3"与"5"不能相连. 这是对上一题增加难度。但是需要 1. 去掉 3,5之间的联通 diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index c5e3f6b..5c4d002 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -9,7 +9,7 @@ 解决这一类问题时,可以从以下几个方面考虑: -* 万能的蛮力琼剧 +* 万能的蛮力穷举 * 散列表空间换事件 * 分治法,然后归并 (归并排序) * 选择合适的数据结构可以显著提高算法效率 (堆排序求top-k) @@ -17,7 +17,7 @@ * 贪心算法或动态规划 -#### 数组中超过出现次数超过一半的数字 +## 数组中超过出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 @@ -25,7 +25,7 @@ -#### 找数组里面重复的一个数 +## 找数组里面重复的一个数 找数组里面重复的一个数,一个含n个元素的整数数组至少存在一个重复数,请编程实现,在O(n)时间内找出其中任意一个重复数。 @@ -37,7 +37,7 @@ 类似问题:找出数组中唯一的重复元素 -#### 数组中找出某数字出现的次数 +## 数组中找出某数字出现的次数 在排序数组中,找出给定数字的出现次数。比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。 @@ -52,7 +52,7 @@ int binary_search_lash(int *a,int length,int key); -#### 查找最小的k个元素(top-k) +## 查找最小的k个元素(top-k) 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 @@ -67,7 +67,7 @@ topMaxK(int *a,int length, int k); 2. 部分排序 维护一个大小为K的数组,由大到小排序,然后遍历所有数据,每个数据跟数组中最小元素比较,如果比最小元素大,就要插入数组了,这里还有寻找插入位置,移动数组元素的cpu消耗。复杂度是N*K 3. 堆排序 。在这的K较大时(比如这道题目:2亿个整数中求最大的100万之和),上面的算法还是有很多可以改进的地方,如采用二分查找定位插入位置,移动数组元素的计算是躲不过去了。那有没有什么数据结构即能`快速查找,还能快速移动元素`呢?最好是O(1)复杂度。 -答案就是`二叉堆`。我们可以遍历总量中的每个元素来跟二叉堆中的堆顶元素比较(堆顶元素在`小根堆`中最小值,在`大根堆`中是最大值),这样在0(1)复杂度就可以完成查找操作,揭下来需要的操作就是重新调整推结构,复杂度是O(logk),因此整个操作复杂度是 O(n*logk) +答案就是`二叉堆`。我们可以遍历总量中的每个元素来跟二叉堆中的堆顶元素比较(堆顶元素在`小根堆`中最小值,在`大根堆`中是最大值),这样在0(1)复杂度就可以完成查找操作,揭下来需要的操作就是重新调整推结构,复杂度是O(logk),因此整个操作复杂度是 `O(n*logk)` `top-k 小的时候用 *大根堆* ,top-k 大得时候用 *小根堆*` @@ -76,7 +76,7 @@ topMaxK(int *a,int length, int k); -#### 最长公共子序列 (动态规划的经典题目) +## 最长公共子序列 (动态规划的经典题目) 【最大/小差问题】 求相邻元素的最大差值,有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间 @@ -91,24 +91,26 @@ topMaxK(int *a,int length, int k); -#### 找出和为m的2个数 +## 找出和为m的2个数 -输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 +输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 +要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组【1、2、4、7、11、15=和数字15。由于4+11=15,因此输出4和11。 + ``` //返回0找到,返回-1没找到 int findaddends(int *data,int length,int sum,int *a,int *b); ``` 分析: -数组升序排列,查找可用二分查找,时间复杂度O(logn),这样问题就变成了找其中一个加数的问题,复杂度为N*logN +数组升序排列,查找可用二分查找,时间复杂度`O(logn)`,这样问题就变成了找其中一个加数的问题,复杂度为`N*logN` 巧妙解法:数组2端向中间扫描,复杂度O(N) -#### 和为m的组合 +## 和为m的组合 编程求解:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来. @@ -120,21 +122,18 @@ print_sum_detials(int n , int sum) `动态规划`(类似背包问题) 1. 划分问题 - 2. 选择状态 - 3. 状态转移方程 - 4. 规划方程 -#### 若干个数的和与M最为接近 +## 若干个数的和与M最为接近 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。 -#### 递减数列左移后的数组中找数 +## 递减数列左移后的数组中找数 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} 是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。 @@ -145,7 +144,7 @@ print_sum_detials(int n , int sum) -#### 求子数组的最大和(最大字段和) +## 求子数组的最大和(最大字段和) 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 @@ -185,20 +184,18 @@ print_sum_detials(int n , int sum) - - -#### 给出一个洗牌算法 +## 给出一个洗牌算法 给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里 -分析:扑克牌54张【2~10,J,Q,K,A,小王,大王】 +分析:扑克牌54张`2~10,J,Q,K,A,小王,大王` 1)产生随机数, 随机数 rand()%54 ,rand()每次运行都一样,要改为srand(time(NULL)) 2) 遍历数组, 随机数k属于区间[i,n],然后a[i] 和 随机数 a[k] 对换 -#### 重合区间最长的两个区间段 +## 重合区间最长的两个区间段 在一维坐标轴上有n个区间段,求重合区间最长的两个区间段 如【-7,21】,【4,23】,【14,100】,【54,76】 @@ -208,7 +205,7 @@ print_sum_detials(int n , int sum) -#### 奇偶分离 +## 奇偶分离 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n) @@ -220,21 +217,19 @@ print_sum_detials(int n , int sum) - - 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间, 能否设计一个算法实现? 分析:难点在于 `不用辅助空间`。 -思路一: sum(数组元素的总和)-sum(1~1000) 得到的差即为重复元素,N较大时注意总和溢出 +思路一: `sum(数组元素的总和)-sum(1~1000)` 得到的差即为重复元素,N较大时注意总和溢出 思路二: 异或操作(位运算) -#### 找出数组中两个只出现一次的数字 +## 找出数组中两个只出现一次的数字 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 @@ -247,7 +242,7 @@ print_sum_detials(int n , int sum) -#### 用递归的方法判断整数组a[N]是不是升序排列 +## 用递归的方法判断整数组a[N]是不是升序排列 递归 isAscend(n-1) && a[N-1]< a[N] @@ -283,7 +278,7 @@ print_sum_detials(int n , int sum) -#### 扑克牌的顺子 +## 扑克牌的顺子 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 @@ -300,7 +295,7 @@ isShunZi(int *a,int length) -#### n个骰子的点数 +## n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。 输入n,打印出S的所有可能的值出现的概率。 @@ -311,7 +306,7 @@ isShunZi(int *a,int length) -#### 把数组排成最小的数 +## 把数组排成最小的数 题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。 例如输入数组{32, 321},则输出这两个能排成的最小数字32132。 @@ -320,7 +315,7 @@ isShunZi(int *a,int length) -#### 旋转数组中的最小元素。 +## 旋转数组中的最小元素。 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。 @@ -333,7 +328,7 @@ isShunZi(int *a,int length) -#### 分割数组 +## 分割数组 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。 能否只用一个额外数组和少量其它空间实现。 @@ -342,14 +337,14 @@ isShunZi(int *a,int length) -#### 约瑟夫环问题 +## 约瑟夫环问题 n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。 -如 0,1,2,3,4,5 删除第2个数字 (n=6,m=2) +如 `0,1,2,3,4,5` 删除第2个数字 (n=6,m=2) 第一次删除:1 第二次删除: 3 第三次删除:5 @@ -361,7 +356,7 @@ n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, -#### 圆形和正方形是否相交 +## 圆形和正方形是否相交 用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交 3D坐标系 原点(0.0,0.0,0.0) @@ -382,7 +377,7 @@ n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, -#### 两个序列和只差最小 +## 两个序列和只差最小 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 @@ -394,7 +389,7 @@ var b=[1, 2, 3, 4,5,40]; -#### 重新排列使负数排在正数前面 +## 重新排列使负数排在正数前面 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序 @@ -426,7 +421,7 @@ updated:设置一个起始点j, 一个翻转点k,一个终止点L -#### 求最大重叠区间大小 +## 求最大重叠区间大小 题目描述:请编写程序,找出下面“输入数据及格式”中所描述的输入数据文件中最大重叠区间的大小。 对一个正整数 n ,如果n在数据文件中某行的两个正整数(假设为A和B)之间,即A<=n<=B或A>=n>=B ,则 n 属于该行; @@ -437,14 +432,14 @@ updated:设置一个起始点j, 一个翻转点k,一个终止点L -#### 四对括号可以有多少种匹配排列方式 +## 四对括号可以有多少种匹配排列方式 比如两对括号可以有两种:()()和(()) -#### 输出1到最大的N位数 +## 输出1到最大的N位数 题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。 @@ -457,7 +452,7 @@ updated:设置一个起始点j, 一个翻转点k,一个终止点L -#### 和为n连续正数序列 +## 和为n连续正数序列 题目:输入一个正数n,输出所有和为n连续正数序列。 @@ -471,20 +466,20 @@ print_continuous_sequence_sum(int n) 思路二: a[small,big] sum[small,big]>N small往前移动,否则,big往前移动。 O(N)复杂度搞定 -### 找出和为N+1的2个数 +## 找出和为N+1的2个数 一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。 -设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。 -复杂度最好是O(n),如果是O(n2)则不得分。 +设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于`N+1`。 +复杂度最好是`O(n)`,如果是 `O(n2)`则不得分。 -分析:列出所有的数对,如输入15,输出【1,14】【2,13】【3,12】。。。 +分析:列出所有的数对,如输入15,输出`【1,14】【2,13】【3,12】。。。` ``` int print_sequence_sum(int n) ``` -#### 寻找丑数 +## 寻找丑数 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。 例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。 @@ -509,7 +504,7 @@ int print_sequence_sum(int n) -#### 调整数组顺序使奇数位于偶数前面 +## 调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, 所有偶数位于数组的后半部分。要求时间复杂度为O(n)。 @@ -521,7 +516,7 @@ void reorder(int *data, int length); ``` -#### 在从1到n的正数中1出现的次数 +## 在从1到n的正数中1出现的次数 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 @@ -536,22 +531,22 @@ int one_appear_count(int n); -#### 求一个数组的最长递减子序列 +## 求一个数组的最长递减子序列 - 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} + 比如`{9,4,3,2,5,4,3,2}`的最长递减子序列为`{9,5,4,3,2}` `动态规划` -#### 如何求2个集合的交集 +## 如何求2个集合的交集 1.每个集合里面是否有重复元素? 思路一:hash,复杂度O(M+N) -#### 两两之差绝对值最小的值 +## 两两之差绝对值最小的值 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 如 [-1, 3, 5, 9] 绝对值最小的是2(5-3) @@ -563,7 +558,7 @@ int one_appear_count(int n); -#### 数值是否连续相邻 +## 数值是否连续相邻 一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。 注意: @@ -577,7 +572,7 @@ int one_appear_count(int n); -#### 最长递增子序列 +## 最长递增子序列 题目描述:设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列 Lin=< aK1,ak2,…,akm >,其中k1< k2<…< km且aK1< ak2<…< akm。 @@ -590,7 +585,7 @@ Lin=< aK1,ak2,…,akm >,其中k1< k2<…< km且aK1< ak2<…< akm。 -#### Fibonacci数列 +## Fibonacci数列 题目:定义Fibonacci数列如下: / 0 n=0 @@ -609,7 +604,7 @@ f(n)= 1 n=1 -#### 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 +## 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 diff --git "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" index c6e264d..826c0a5 100644 --- "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" +++ "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" @@ -3,7 +3,7 @@ 矩阵在计算机中表示就是二维数组。这部分内容都是有关二维数组和矩阵相关的题目。 -#### 二维数组中的查找 +## 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 @@ -11,7 +11,7 @@ int exist_inmatrix(int *matrix,int rows,int cols,int num); ``` -#### 矩阵中最大的二维矩阵 +## 矩阵中最大的二维矩阵 求一个矩阵中最大的二维矩阵(元素和最大).如: ``` @@ -32,7 +32,7 @@ int max_sum_submatrix(int *matrix,int rows,int cols,int *tmatrix,int *trows,int ``` -#### 顺时针打印矩阵 +## 顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: @@ -100,7 +100,7 @@ void print_matrix_incircle(int *matrix,int rows,int cols,int start){ -#### 从小到大输出矩阵的值 +## 从小到大输出矩阵的值 思路1:采用归并进行排序然后进行顺序打印 @@ -125,6 +125,7 @@ void printArry(int *a,int rows,int columns) int* pArr1=new int[rows];//共存有这么多行指针 for(int i=0;i=40,重复第一步。参考代码如下所示: +2.如果`a1*7+a2<40,b=(a1*7+a2)/4+1`;如果`a1*7+a2>=40`, 重复第一步。参考代码如下所示: + + +``` + int rand7() { return rand()%7+1; @@ -220,8 +225,7 @@ int rand10() } while (a10>= 40); return (a71*7+a72)/4+1; } - - +``` From 46f1c0e9939dd34daab98f80599604202c471879 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 13:31:30 +0800 Subject: [PATCH 065/151] update string --- .../1 \345\255\227\347\254\246\344\270\262.md" | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index a038344..bb05c37 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -19,7 +19,10 @@ char *revert_by_word(char *source); ``` -原地逆序,字符串2边的字符逐个交换 , 再按单词逆序; 也可以先按单词逆序,再对整个句子逆序; +思路: + +* 原地逆序,字符串2边的字符逐个交换 , 再按单词逆序; +* 也可以先按单词逆序,再对整个句子逆序; 针对不允许临时空间的情况,也就是字符交换不用临时空间,可以使用的方法有: @@ -83,18 +86,21 @@ char *revert_by_word(char *source){ >字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 -如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 +如把`字符串abcdef`左旋转2位得到`字符串cdefab` 。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 ``` char *left_rotate(char *str,int offset){ } ``` -我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了,也就是跟上面的问题是同样的问题。 + +思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了,也就是跟上面的问题是同样的问题。 ## 判断字符串是否是回文 +> 回文,如 abcdcba + 分析: 2个指针,一头一尾,逐个比较,都相同就是回文 ``` @@ -270,7 +276,7 @@ char *proc(char *str){ 也就是实现函数atoi的功能,这道题目考查的就是对各种情况下异常处理。比如: -以"213"分析转换成证书的过程。3+1x10+2x100,思路是:每扫描到一个字符,把之前得到的数字*10,再加上当前的数字 +以`213`分析转换成证书的过程。`3+1x10+2x100` ,思路是:每扫描到一个字符,把 `之前得到的数字*10`,再加上当前的数字 * 0开头,"0213" * 正/负数,"-432" ,"--422","++23" From 0a3e78402e21cf831dc77ef8bda2e63bf39fb770 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 13:44:42 +0800 Subject: [PATCH 066/151] update list --- .../2 \351\223\276\350\241\250.md" | 18 +++-------- ...60\345\200\274\351\227\256\351\242\230.md" | 14 +++++++++ ...60\345\210\227\351\227\256\351\242\230.md" | 30 +++++++++++++++++++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 137a8ae..8cb3f70 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -95,10 +95,9 @@ p->next=NULL。此时,原单链表可以看作两条单链表,一条从head ## 复杂链表的复制 -题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外, -还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: +题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: ``` - struct ComplexNode +struct ComplexNode { int m_nValue; ComplexNode* m_pNext; @@ -122,8 +121,7 @@ struct ListNode }; ``` -分析: -第一个公共节点,也就是2个链表中的节点的m_pNext 指向的同一个节点。 +分析:第一个公共节点,也就是2个链表中的节点的m_pNext 指向的同一个节点。 1. 先遍历2个链表,得到各自的长度,和差sub 2. 长链表先遍历sub个节点,然后2个节点一起遍历 @@ -149,6 +147,7 @@ struct ListNode{ ## 在O(1)时间内删除链表结点 + 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: ``` @@ -185,15 +184,6 @@ struct node{ -## 链表和数组的区别在哪里? - -分析:主要在基本概念上的理解。 -但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生, -谁比较仔细,谁获胜的机会就大。 - - - - diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 8544f52..558598d 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -77,6 +77,20 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; ``` +## ipv4 转 int + +比如: 10.67.81.35 , 转为int 为 + +思路: + + +``` +代码 +``` + +那么,int 转 ipv4 如何解呢? + + ## 判断一个自然数是否是某个数的平方 diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index 5c4d002..5f11697 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -109,6 +109,23 @@ int findaddends(int *data,int length,int sum,int *a,int *b); 巧妙解法:数组2端向中间扫描,复杂度O(N) +## 求连续子数组和为m的组合 + +数组 [2,3,1,2,4,3]求连续子数组sum=7, 结果[1,2,4] [3,4] + +* 暴力遍历 +* 滑动窗口, 左指针,右指针 + +``` +if sum Date: Mon, 2 Aug 2021 13:50:13 +0800 Subject: [PATCH 067/151] update list --- ...60\345\210\227\351\227\256\351\242\230.md" | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index 5f11697..a674848 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -74,8 +74,6 @@ topMaxK(int *a,int length, int k); - - ## 最长公共子序列 (动态规划的经典题目) 【最大/小差问题】 @@ -330,8 +328,8 @@ isShunZi(int *a,int length) 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。 输入n,打印出S的所有可能的值出现的概率。 -如n=1,值【1,2,3,4,5,6】每个概率是 1/6 -如n=2,值【1~12】 概率。。 +如n=1,值`【1,2,3,4,5,6】`每个概率是 `1/6` +如n=2,值`【1~12】` 概率。。 @@ -488,19 +486,20 @@ updated:设置一个起始点j, 一个翻转点k,一个终止点L 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 +``` print_continuous_sequence_sum(int n) +``` - -思路一:枚举法。从1开始一直加到等于n,再从2开始。。一直到 n/2+1,在每一轮,都要逐步比较。复杂度O(N^2) - -思路二: a[small,big] sum[small,big]>N small往前移动,否则,big往前移动。 O(N)复杂度搞定 +思路一:枚举法。从1开始一直加到等于n,再从2开始。。一直到 n/2+1,在每一轮,都要逐步比较。复杂度`O(N^2)` +思路二: a[small,big] sum[small,big]>N small往前移动,否则,big往前移动。 `O(N)` 复杂度搞定 ## 找出和为N+1的2个数 -一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。 +一个整数数列,元素取值可能是`1~N`(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。 设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于`N+1`。 -复杂度最好是`O(n)`,如果是 `O(n2)`则不得分。 +复杂度最好是 `O(n)` ,如果是 `O(n2)`则不得分。 + 分析:列出所有的数对,如输入15,输出`【1,14】【2,13】【3,12】。。。` @@ -530,7 +529,7 @@ int print_sequence_sum(int n) 1. [1,30]符合条件有22个 2. [30,60]符合条件也22个 -第1500个: 1500/22=68余4,一个周期内的前4个数是2,3,4,5; 最终答案是`68*30+5` +第1500个: `1500/22=68` 余 4,一个周期内的前4个数是2,3,4,5; 最终答案是`68*30+5` @@ -556,7 +555,7 @@ void reorder(int *data, int length); int one_appear_count(int n); ``` -思路1. 遍历1~n,统计出现1的个数;n足够大时,效率很低 +思路1. 遍历`1~n`,统计出现1的个数;n足够大时,效率很低 思路2. 分析规律 @@ -682,6 +681,7 @@ X0+X1+...+ = 10; 给出两个集合A和B,其中集合A={name}, 集合B={age、sex、scholarship、address、...}, + 要求: 问题1、根据集合A中的name查询出集合B中对应的属性信息; 问题2、根据集合B中的属性信息(单个属性,如age<20等),查询出集合A中对应的name。 @@ -691,3 +691,7 @@ X0+X1+...+ = 10; + + + + From a5adcb1a920bc812d29746586305d476f163930f Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 14:13:21 +0800 Subject: [PATCH 068/151] update dir --- ...3 \345\240\206\345\222\214\346\240\210.md" | 4 +-- ...60\345\210\227\351\227\256\351\242\230.md" | 34 ------------------- .../6 \347\237\251\351\230\265.md" | 34 +++++++++---------- .../1 string/char_first_appear_once.c" | 0 .../1 string/proc.c" | 0 .../1 string/replce_blank.c" | 0 .../1 string/revert_by_word.c" | 0 .../1 string/string.c" | 0 .../20.c" | 4 ++- .../4 numer/Power.c" | 0 .../4 numer/integer_to_bin.c" | 0 .../4 numer/isSquare.c" | 0 .../4 numer/one_appear_count_by_binary.c" | 0 .../4 numer/string_to_integer.c" | 0 .../5 array/delete_occurence_character.c" | 0 .../5 array/factorial.c" | 0 .../5 array/fibonacci.c" | 0 .../5 array/longest_continuious_number.c" | 0 .../5 array/print_continuous_sequence_sum.c" | 1 + .../6 matrix/print_matrix.c" | 0 .../7 bianrytree/binary_search.c" | 0 21 files changed, 22 insertions(+), 55 deletions(-) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/char_first_appear_once.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/char_first_appear_once.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/proc.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/proc.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/replce_blank.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/replce_blank.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/revert_by_word.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/revert_by_word.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/string.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/string.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/Power.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/integer_to_bin.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/isSquare.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/one_appear_count_by_binary.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/string_to_integer.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/delete_occurence_character.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/factorial.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/fibonacci.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/longest_continuious_number.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" (94%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6 matrix/print_matrix.c" (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" => "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7 bianrytree/binary_search.c" (100%) diff --git "a/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" index b26f180..35f5638 100644 --- "a/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" +++ "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" @@ -93,9 +93,7 @@ a < f(top),把 a push 到 辅助栈中 比如输入的push序列是[1、2、3、4、5] ,那么[4、5、3、2、1]就有可能是一个pop序列 因为可以有如下的push和pop序列: -【push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop】 - -这样得到的pop序列就是【4、5、3、2、1】。 +【push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop】, 这样得到的pop序列就是【4、5、3、2、1】。 但序列【4、3、5、1、2】就不可能是push序列【1、2、3、4、5】的pop序列。 diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index a674848..a95ab66 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -644,40 +644,6 @@ f(n)= 1 n=1 ////////////// 数列 /////////////// -输入a1,a2,...,an,b1,b2,...,bn, -在O(n)的时间,O(1)的空间将这个序列顺序改为a1,b1,a2,b2,a3,b3,...,an,bn, -且不需要移动,通过交换完成,只需一个交换空间。 - -例如,N=9时,第2步执行后,实际上中间位置的两边对称的4个元素基本配对, -只需交换中间的两个元素即可,如下表所示。颜色表示每次要交换的元素,左边向右交换,右边向左交换。 -交换过程如下表所示 -交换x1,x3;交换x2,x4;再交换中间的x1,x4;交换y1,y2。 - - - - -给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 -要求下排每个数都是先前上排那十个数在下排出现的次数。 -上排的十个数如下: - -【0,1,2,3,4,5,6,7,8,9】 - -初看此题,貌似很难,10分钟过去了,可能有的人,题目都还没看懂。 - -举一个例子, -数值: 0,1,2,3,4,5,6,7,8,9 -分配: 6,2,1,0,0,0,1,0,0,0 -0在下排出现了6次,1在下排出现了2次, -2在下排出现了1次,3在下排出现了0次.... -以此类推.. - -0xX0+1xX1+2xX2....+9xX9 = 10; -X0+X1+...+ = 10; - -转换成多元一次方程求通解的问题。(Matlib) - - - 给出两个集合A和B,其中集合A={name}, 集合B={age、sex、scholarship、address、...}, diff --git "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" index 826c0a5..9b4ed06 100644 --- "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" +++ "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" @@ -7,10 +7,21 @@ 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 + +``` +1 3 5 7 +2 5 7 12 +4 6 9 23 +6 9 23 75 +``` + + ``` -int exist_inmatrix(int *matrix,int rows,int cols,int num); +int exist_inmatrix(int *matrix,int rows,int cols,int target); ``` + + ## 矩阵中最大的二维矩阵 求一个矩阵中最大的二维矩阵(元素和最大).如: @@ -25,7 +36,10 @@ int exist_inmatrix(int *matrix,int rows,int cols,int num); 5 3 ``` -要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码 +要求: +(1)写出算法; +(2)分析时间复杂度; +(3)用C写出关键代码 ``` int max_sum_submatrix(int *matrix,int rows,int cols,int *tmatrix,int *trows,int tcols) @@ -125,7 +139,7 @@ void printArry(int *a,int rows,int columns) int* pArr1=new int[rows];//共存有这么多行指针 for(int i=0;i #include - #define PrintInt(expr) printf("%s : %d\n",#expr,(expr)) + +#define PrintInt(expr) printf("%s : %d\n",#expr,(expr)) + int main() { int y = 100; diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/Power.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/Power.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/Power.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/integer_to_bin.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/3.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/integer_to_bin.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/isSquare.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/9.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/isSquare.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/one_appear_count_by_binary.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/one_appear_count_by_binary.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/one_appear_count_by_binary.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/string_to_integer.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/string_to_integer.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/delete_occurence_character.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/delete_occurence_character.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/delete_occurence_character.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/factorial.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/2.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/factorial.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/fibonacci.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/fibonacci.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/fibonacci.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/longest_continuious_number.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/longest_continuious_number.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/longest_continuious_number.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" similarity index 94% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" index ee5ac8b..b6667a2 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/11.c" +++ "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" @@ -2,6 +2,7 @@ #include "stdio.h" +//打印和为n的2个值 void print_continuous_sequence_sum(int n){// n=1,2 int small=1; diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6 matrix/print_matrix.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/print_matrix.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6 matrix/print_matrix.c" diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" "b/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7 bianrytree/binary_search.c" similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6.c" rename to "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7 bianrytree/binary_search.c" From 10b17169b1098ac4ce5a622f5ab9be0d2b7d3f42 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 15:14:44 +0800 Subject: [PATCH 069/151] update questions --- .../2 \351\223\276\350\241\250.md" | 5 ++++ ...60\345\200\274\351\227\256\351\242\230.md" | 5 ++++ ...60\345\210\227\351\227\256\351\242\230.md" | 22 ++++++++++++++ .../6 \347\237\251\351\230\265.md" | 25 ++++++++++++++++ ...7 \344\272\214\345\217\211\346\240\221.md" | 6 ++++ .../7 \346\240\221.md" | 13 +++++++++ .../8 \345\233\276.md" | 29 +++++++++++-------- 7 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 "9 Algorithms Job Interview/7 \346\240\221.md" diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 8cb3f70..1360eb9 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -52,6 +52,11 @@ struct Node * sort_link_list_increasing_order (Node *pheader): ``` +## 单链表归并排序 + +啥是归并排序? + + ## 给定单链表,检测是否有环。 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 558598d..8bbf596 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -6,6 +6,11 @@ * 大数问题 +## int转二进 + + + + ## 求1+2+…+n 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index a95ab66..79890a9 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -17,6 +17,18 @@ * 贪心算法或动态规划 + +## 使用归并排序对一个 int 类型的数组排序 + + +比如 [1, 6, 2, 2, 2, 3] + +``` +void sort(int * a, int length) +``` + + + ## 数组中超过出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 @@ -37,6 +49,7 @@ 类似问题:找出数组中唯一的重复元素 + ## 数组中找出某数字出现的次数 在排序数组中,找出给定数字的出现次数。比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。 @@ -69,9 +82,18 @@ topMaxK(int *a,int length, int k); 答案就是`二叉堆`。我们可以遍历总量中的每个元素来跟二叉堆中的堆顶元素比较(堆顶元素在`小根堆`中最小值,在`大根堆`中是最大值),这样在0(1)复杂度就可以完成查找操作,揭下来需要的操作就是重新调整推结构,复杂度是O(logk),因此整个操作复杂度是 `O(n*logk)` + `top-k 小的时候用 *大根堆* ,top-k 大得时候用 *小根堆*` +## 找第k大的数 + +比如 1,2,3,4,5,6,7和8这8个数字,低3大的数字是 6 + +``` +int topK(int * a, int length, int k) +``` + ## 最长公共子序列 (动态规划的经典题目) diff --git "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" index 9b4ed06..fe347cb 100644 --- "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" +++ "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" @@ -165,3 +165,28 @@ void printArry(int *a,int rows,int columns) + +## 矩阵中的最大上升路径 + +``` +nums = [ + [9,9,4], + [6,6,8], + [2,1,1], +] +``` +返回4, 最长上升路径 [1,2,6,9] ; + +> Google 面试题, 此题采用bfs和拓扑排序均可达到面试官的要求。笔者认为,一般的bfs可以达到hire;记忆化搜索和拓扑排序可以达到strong hire + + + + + + + + + + + + diff --git "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" index c648fc9..d51391d 100644 --- "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" +++ "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" @@ -209,6 +209,12 @@ struct TreeNode +## 求一个二叉树中任意两个节点间的最大距离 + +两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。 + + + diff --git "a/9 Algorithms Job Interview/7 \346\240\221.md" "b/9 Algorithms Job Interview/7 \346\240\221.md" new file mode 100644 index 0000000..957ce48 --- /dev/null +++ "b/9 Algorithms Job Interview/7 \346\240\221.md" @@ -0,0 +1,13 @@ +# 树 + + +## 给一棵树 求最大宽度 + + + + +## 树的广度遍历深度遍历 + + + +## 多叉树的层序遍历 diff --git "a/9 Algorithms Job Interview/8 \345\233\276.md" "b/9 Algorithms Job Interview/8 \345\233\276.md" index f8b18cf..25f22c0 100644 --- "a/9 Algorithms Job Interview/8 \345\233\276.md" +++ "b/9 Algorithms Job Interview/8 \345\233\276.md" @@ -1,28 +1,33 @@ -31.华为面试题: -一类似于蜂窝的结构的图,进行搜索最短路径(要求5分钟) +深度优先遍历(DFS)和广度优先遍历(BFS) 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中 -求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边, -有向图不再连通,描述算法。 +## 深度优先遍历 +深度优先遍历(DFS) +## 广度优先遍历 -11、平面上N个点,每两个点都确定一条直线, -求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。 +广度优先遍历(BFS) -2.求一个有向连通图的割点,割点的定义是, -如果除去此节点和与其相关的边,有向图不再连通,描述算法。 - +## 华为面试题:一类似于蜂窝的结构的图,进行搜索最短路径(要求5分钟) + + + +## 求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边, +有向图不再连通,描述算法。 + + - 求一个二叉树中任意两个节点间的最大距离, -两个节点的距离的定义是 这两个节点间边的个数, -比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。 +## 平面上N个点,每两个点都确定一条直线, +求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。 + + From acecb36058273b69a6f61a0c5f08f638269c93c6 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 15:21:47 +0800 Subject: [PATCH 070/151] update dir --- ...1 \345\255\227\347\254\246\344\270\262.md" | 50 ++++++++++--------- .../2 \351\223\276\350\241\250.md" | 2 +- ...73\347\273\237\350\256\276\350\256\241.md" | 26 +++++----- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index bb05c37..c77468f 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -366,29 +366,6 @@ char *trim_number(char *source){ -## 字符串原地压缩 - -题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 - -这道题需要注意: -1. 单个字符不压缩 -2. 注意考虑压缩后某个字符个数是多位数(超过10个) -3. 原地压缩最麻烦的地方就是数据移动 - - -这是使用2个指针,一前一后,如果不相等,都往前移动一位;如果相等,后一位变为数字2,且移动后面的指针一位,任然相等则数字加1,不相等 - - -``` -char *compress(const char *src,char *dest){ - -} -``` - -上面的压缩算法可以看到,压缩算法的`效率`验证依赖`给定字符串的特性`,如果'aaaaaaaa....aaa' 这样特征的字符串,使用上面的压缩算法,压缩率接近100%,相反,可能会的0%的压缩率。 - - - ## 字符串中找出连续最长的数字串 @@ -456,7 +433,6 @@ int longest_continuious_number(const char *input,char *output){ ``` - ## 求最大连续递增数字串 如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。 @@ -520,6 +496,32 @@ char *substr_count(const char *src, const char *substr, int *count) + +## 字符串原地压缩 + +题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 + +这道题需要注意: +1. 单个字符不压缩 +2. 注意考虑压缩后某个字符个数是多位数(超过10个) +3. 原地压缩最麻烦的地方就是数据移动 + + +这是使用2个指针,一前一后,如果不相等,都往前移动一位;如果相等,后一位变为数字2,且移动后面的指针一位,任然相等则数字加1,不相等 + + +``` +char *compress(const char *src,char *dest){ + +} +``` + +上面的压缩算法可以看到,压缩算法的`效率`验证依赖`给定字符串的特性`,如果'aaaaaaaa....aaa' 这样特征的字符串,使用上面的压缩算法,压缩率接近100%,相反,可能会的0%的压缩率。 + + + + + ## 请编写能直接实现strstr()函数功能的代码。 > strstr(str1,str2) 判断str2是否是str1的子串。 diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 1360eb9..900e73b 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -162,7 +162,7 @@ struct ListNode{ }; //函数的声明如下: -void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); +void deleteNode(ListNode* pListHead, ListNode* pToBeDeleted); ``` diff --git "a/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" "b/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" index 84e8475..6dfba5d 100644 --- "a/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" +++ "b/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" @@ -1,28 +1,27 @@ -#### 要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。 +## 要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。 - -#### 设计一个系统处理词语搭配问题 +## 设计一个系统处理词语搭配问题 设计一个系统处理词语搭配问题,比如说 中国 和人民可以搭配, 则中国人民 人民中国都有效。要求: -*系统每秒的查询数量可能上千次; -*词语的数量级为10W; -*每个词至多可以与1W个词搭配 +* 系统每秒的查询数量可能上千次; +* 词语的数量级为10W; +* 每个词至多可以与1W个词搭配 当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。 -#### 任务调度 +## 任务调度 系统有很多任务,任务之间有依赖,比如B依赖于A,则A执行完后B才能执行 - (1)不考虑系统并行性,设计一个函数(Task *Ptask,int Task_num)不考虑并行度,最快的方法完成所有任务。 + (1)不考虑系统并行性,设计一个函数`(Task *Ptask,int Task_num)`不考虑并行度,最快的方法完成所有任务。 (2)考虑并行度,怎么设计 ``` @@ -41,14 +40,13 @@ ``` -#### 设计一种内存管理算法 +## 设计一种内存管理算法 相关的问题: -##### 请编写实现malloc()内存分配函数功能一样的代码 - -##### 用C语言实现函数memmove()函数 +* 请编写实现malloc()内存分配函数功能一样的代码 +* 用C语言实现函数memmove()函数 ``` void * memmove(void *dest, const void *src, size_t n) @@ -61,11 +59,11 @@ memmove()函数的功能是拷贝src所指的内存内容前n个字节到dest所 -#### A向B发邮件,B收到后读取并发送收到,但是中间可能丢失了该邮件,怎么设计一种最节省的方法,来处理丢失问题。 +## A向B发邮件,B收到后读取并发送收到,但是中间可能丢失了该邮件,怎么设计一种最节省的方法,来处理丢失问题。 -#### 设计一种算法求出算法复杂度 +## 设计一种算法求出算法复杂度 From 136b59671d31e49122ae9358d1c070f2c282d737 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 2 Aug 2021 18:54:16 +0800 Subject: [PATCH 071/151] update gitignore --- .gitignore | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 2ca7752..75a69c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -#### - *.gitignore *.out *.dSYM @@ -10,9 +8,7 @@ *ipslice* *.log - - - -##### +cmake-build-debug +*.idea From 1841228814d796754d598c87a06f639062df61eb Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 17 Aug 2021 17:39:37 +0800 Subject: [PATCH 072/151] refactor --- .../1 \345\255\227\347\254\246\344\270\262.md" | 9 ++++++++- .../codes/1 string/char_first_appear_once.c | 0 .../codes/1 string/proc.c | 0 .../codes/1 string/replce_blank.c | 0 .../codes/1 string/revert_by_word.c | 4 ++-- .../codes/1 string/string.c | 2 +- .../10.c" => 9 Algorithms Job Interview/codes/10.c | 0 .../12.c" => 9 Algorithms Job Interview/codes/12.c | 0 .../20.c" => 9 Algorithms Job Interview/codes/20.c | 0 .../21.c" => 9 Algorithms Job Interview/codes/21.c | 0 .../22.c" => 9 Algorithms Job Interview/codes/22.c | 0 .../23.c" => 9 Algorithms Job Interview/codes/23.c | 0 .../24.c" => 9 Algorithms Job Interview/codes/24.c | 0 .../25.c" => 9 Algorithms Job Interview/codes/25.c | 0 .../26.c" => 9 Algorithms Job Interview/codes/26.c | 0 .../27.c" => 9 Algorithms Job Interview/codes/27.c | 0 .../28.c" => 9 Algorithms Job Interview/codes/28.c | 0 .../codes/4 numer/Power.c | 0 .../codes/4 numer/integer_to_bin.c | 0 .../codes/4 numer/isSquare.c | 0 .../codes/4 numer/one_appear_count_by_binary.c | 0 .../codes/4 numer/string_to_integer.c | 0 .../4-1.c" => 9 Algorithms Job Interview/codes/4-1.c | 0 .../codes/5 array/delete_occurence_character.c | 0 .../codes/5 array/factorial.c | 0 .../codes/5 array/fibonacci.c | 0 .../codes/5 array/longest_continuious_number.c | 0 .../codes/5 array/print_continuous_sequence_sum.c | 0 .../5.c" => 9 Algorithms Job Interview/codes/5.c | 0 .../codes/6 matrix/print_matrix.c | 0 .../codes/7 bianrytree/binary_search.c | 0 .../codes/7 bianrytree/bt1.c | 6 ++---- .../7.c" => 9 Algorithms Job Interview/codes/7.c | 0 .../8.c" => 9 Algorithms Job Interview/codes/8.c | 0 .../c1.c" => 9 Algorithms Job Interview/codes/c1.c | 0 .../c10.c" => 9 Algorithms Job Interview/codes/c10.c | 0 .../codes/c11-2.c | 2 +- .../c11.c" => 9 Algorithms Job Interview/codes/c11.c | 0 .../c12.c" => 9 Algorithms Job Interview/codes/c12.c | 0 .../codes/c13-1.c | 0 .../codes/c13-2.c | 3 +-- .../c14.c" => 9 Algorithms Job Interview/codes/c14.c | 0 .../c15.c" => 9 Algorithms Job Interview/codes/c15.c | 0 .../c16.c" => 9 Algorithms Job Interview/codes/c16.c | 0 .../c17.c" => 9 Algorithms Job Interview/codes/c17.c | 0 .../c18.c" => 9 Algorithms Job Interview/codes/c18.c | 0 .../c19.c" => 9 Algorithms Job Interview/codes/c19.c | 0 .../c2.c" => 9 Algorithms Job Interview/codes/c2.c | 0 .../c20.c" => 9 Algorithms Job Interview/codes/c20.c | 0 .../c3.c" => 9 Algorithms Job Interview/codes/c3.c | 0 .../c4.c" => 9 Algorithms Job Interview/codes/c4.c | 0 .../c5.c" => 9 Algorithms Job Interview/codes/c5.c | 0 .../c6.c" => 9 Algorithms Job Interview/codes/c6.c | 0 .../c7.c" => 9 Algorithms Job Interview/codes/c7.c | 0 .../c8.c" => 9 Algorithms Job Interview/codes/c8.c | 0 .../c9.c" => 9 Algorithms Job Interview/codes/c9.c | 0 .../codes/most_visit_ip.c | 10 ---------- 57 files changed, 15 insertions(+), 21 deletions(-) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/char_first_appear_once.c" => 9 Algorithms Job Interview/codes/1 string/char_first_appear_once.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/proc.c" => 9 Algorithms Job Interview/codes/1 string/proc.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/replce_blank.c" => 9 Algorithms Job Interview/codes/1 string/replce_blank.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/revert_by_word.c" => 9 Algorithms Job Interview/codes/1 string/revert_by_word.c (92%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/string.c" => 9 Algorithms Job Interview/codes/1 string/string.c (99%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" => 9 Algorithms Job Interview/codes/10.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" => 9 Algorithms Job Interview/codes/12.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" => 9 Algorithms Job Interview/codes/20.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" => 9 Algorithms Job Interview/codes/21.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" => 9 Algorithms Job Interview/codes/22.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" => 9 Algorithms Job Interview/codes/23.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" => 9 Algorithms Job Interview/codes/24.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" => 9 Algorithms Job Interview/codes/25.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" => 9 Algorithms Job Interview/codes/26.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" => 9 Algorithms Job Interview/codes/27.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" => 9 Algorithms Job Interview/codes/28.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/Power.c" => 9 Algorithms Job Interview/codes/4 numer/Power.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/integer_to_bin.c" => 9 Algorithms Job Interview/codes/4 numer/integer_to_bin.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/isSquare.c" => 9 Algorithms Job Interview/codes/4 numer/isSquare.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/one_appear_count_by_binary.c" => 9 Algorithms Job Interview/codes/4 numer/one_appear_count_by_binary.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/string_to_integer.c" => 9 Algorithms Job Interview/codes/4 numer/string_to_integer.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" => 9 Algorithms Job Interview/codes/4-1.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/delete_occurence_character.c" => 9 Algorithms Job Interview/codes/5 array/delete_occurence_character.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/factorial.c" => 9 Algorithms Job Interview/codes/5 array/factorial.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/fibonacci.c" => 9 Algorithms Job Interview/codes/5 array/fibonacci.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/longest_continuious_number.c" => 9 Algorithms Job Interview/codes/5 array/longest_continuious_number.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" => 9 Algorithms Job Interview/codes/5 array/print_continuous_sequence_sum.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" => 9 Algorithms Job Interview/codes/5.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6 matrix/print_matrix.c" => 9 Algorithms Job Interview/codes/6 matrix/print_matrix.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7 bianrytree/binary_search.c" => 9 Algorithms Job Interview/codes/7 bianrytree/binary_search.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" => 9 Algorithms Job Interview/codes/7 bianrytree/bt1.c (71%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" => 9 Algorithms Job Interview/codes/7.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" => 9 Algorithms Job Interview/codes/8.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" => 9 Algorithms Job Interview/codes/c1.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" => 9 Algorithms Job Interview/codes/c10.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" => 9 Algorithms Job Interview/codes/c11-2.c (90%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" => 9 Algorithms Job Interview/codes/c11.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" => 9 Algorithms Job Interview/codes/c12.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" => 9 Algorithms Job Interview/codes/c13-1.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" => 9 Algorithms Job Interview/codes/c13-2.c (85%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" => 9 Algorithms Job Interview/codes/c14.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" => 9 Algorithms Job Interview/codes/c15.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" => 9 Algorithms Job Interview/codes/c16.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" => 9 Algorithms Job Interview/codes/c17.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" => 9 Algorithms Job Interview/codes/c18.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" => 9 Algorithms Job Interview/codes/c19.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" => 9 Algorithms Job Interview/codes/c2.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" => 9 Algorithms Job Interview/codes/c20.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" => 9 Algorithms Job Interview/codes/c3.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" => 9 Algorithms Job Interview/codes/c4.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" => 9 Algorithms Job Interview/codes/c5.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" => 9 Algorithms Job Interview/codes/c6.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" => 9 Algorithms Job Interview/codes/c7.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" => 9 Algorithms Job Interview/codes/c8.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" => 9 Algorithms Job Interview/codes/c9.c (100%) rename "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" => 9 Algorithms Job Interview/codes/most_visit_ip.c (99%) diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index c77468f..30960ee 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -39,6 +39,7 @@ a = a - b; 最终示例代码: ``` +//反转 void _reverse(char *start,char *end){ if ((start == NULL) || (end == NULL)) return; while(start < end){ @@ -55,11 +56,15 @@ char *revert_by_word(char *source){ char *end = source; char *start = source; if (source == NULL) return NULL; + + //end指针挪动到尾部 while (*end != '\0') end++; end--; + //先全部反转 _reverse(start,end); + //按单词反转 start=end=source; while(*start != '\0'){ if (*start == ' '){ @@ -94,7 +99,9 @@ char *left_rotate(char *str,int offset){ } ``` -思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了,也就是跟上面的问题是同样的问题。 +思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了。 +也就是跟上面的问题是同样的问题。 + ## 判断字符串是否是回文 diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/char_first_appear_once.c" b/9 Algorithms Job Interview/codes/1 string/char_first_appear_once.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/char_first_appear_once.c" rename to 9 Algorithms Job Interview/codes/1 string/char_first_appear_once.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/proc.c" b/9 Algorithms Job Interview/codes/1 string/proc.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/proc.c" rename to 9 Algorithms Job Interview/codes/1 string/proc.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/replce_blank.c" b/9 Algorithms Job Interview/codes/1 string/replce_blank.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/replce_blank.c" rename to 9 Algorithms Job Interview/codes/1 string/replce_blank.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/revert_by_word.c" b/9 Algorithms Job Interview/codes/1 string/revert_by_word.c similarity index 92% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/revert_by_word.c" rename to 9 Algorithms Job Interview/codes/1 string/revert_by_word.c index da95e3a..ea113b1 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/revert_by_word.c" +++ b/9 Algorithms Job Interview/codes/1 string/revert_by_word.c @@ -51,7 +51,7 @@ int main(int argc, char const *argv[]) char *test = "how are you ?"; printf("%s\n",_revert_by_word(test)); - //char *test = "I am a student."; - //printf("%s\n",revert_by_word(test)); + test = "I am a student."; + printf("%s\n",revert_by_word(test)); return 0; } diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/string.c" b/9 Algorithms Job Interview/codes/1 string/string.c similarity index 99% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/string.c" rename to 9 Algorithms Job Interview/codes/1 string/string.c index 88fe732..9d778b2 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/1 string/string.c" +++ b/9 Algorithms Job Interview/codes/1 string/string.c @@ -264,7 +264,7 @@ void compress(char *src){ } int count = 1; - char *back=src,forward=src+1; + char *back=src,*forward=src+1; while(*forward){ diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" b/9 Algorithms Job Interview/codes/10.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/10.c" rename to 9 Algorithms Job Interview/codes/10.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" b/9 Algorithms Job Interview/codes/12.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/12.c" rename to 9 Algorithms Job Interview/codes/12.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" b/9 Algorithms Job Interview/codes/20.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/20.c" rename to 9 Algorithms Job Interview/codes/20.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" b/9 Algorithms Job Interview/codes/21.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/21.c" rename to 9 Algorithms Job Interview/codes/21.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" b/9 Algorithms Job Interview/codes/22.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/22.c" rename to 9 Algorithms Job Interview/codes/22.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" b/9 Algorithms Job Interview/codes/23.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/23.c" rename to 9 Algorithms Job Interview/codes/23.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" b/9 Algorithms Job Interview/codes/24.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/24.c" rename to 9 Algorithms Job Interview/codes/24.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" b/9 Algorithms Job Interview/codes/25.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/25.c" rename to 9 Algorithms Job Interview/codes/25.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" b/9 Algorithms Job Interview/codes/26.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/26.c" rename to 9 Algorithms Job Interview/codes/26.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" b/9 Algorithms Job Interview/codes/27.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/27.c" rename to 9 Algorithms Job Interview/codes/27.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" b/9 Algorithms Job Interview/codes/28.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/28.c" rename to 9 Algorithms Job Interview/codes/28.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/Power.c" b/9 Algorithms Job Interview/codes/4 numer/Power.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/Power.c" rename to 9 Algorithms Job Interview/codes/4 numer/Power.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/integer_to_bin.c" b/9 Algorithms Job Interview/codes/4 numer/integer_to_bin.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/integer_to_bin.c" rename to 9 Algorithms Job Interview/codes/4 numer/integer_to_bin.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/isSquare.c" b/9 Algorithms Job Interview/codes/4 numer/isSquare.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/isSquare.c" rename to 9 Algorithms Job Interview/codes/4 numer/isSquare.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/one_appear_count_by_binary.c" b/9 Algorithms Job Interview/codes/4 numer/one_appear_count_by_binary.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/one_appear_count_by_binary.c" rename to 9 Algorithms Job Interview/codes/4 numer/one_appear_count_by_binary.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/string_to_integer.c" b/9 Algorithms Job Interview/codes/4 numer/string_to_integer.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4 numer/string_to_integer.c" rename to 9 Algorithms Job Interview/codes/4 numer/string_to_integer.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" b/9 Algorithms Job Interview/codes/4-1.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/4-1.c" rename to 9 Algorithms Job Interview/codes/4-1.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/delete_occurence_character.c" b/9 Algorithms Job Interview/codes/5 array/delete_occurence_character.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/delete_occurence_character.c" rename to 9 Algorithms Job Interview/codes/5 array/delete_occurence_character.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/factorial.c" b/9 Algorithms Job Interview/codes/5 array/factorial.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/factorial.c" rename to 9 Algorithms Job Interview/codes/5 array/factorial.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/fibonacci.c" b/9 Algorithms Job Interview/codes/5 array/fibonacci.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/fibonacci.c" rename to 9 Algorithms Job Interview/codes/5 array/fibonacci.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/longest_continuious_number.c" b/9 Algorithms Job Interview/codes/5 array/longest_continuious_number.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/longest_continuious_number.c" rename to 9 Algorithms Job Interview/codes/5 array/longest_continuious_number.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" b/9 Algorithms Job Interview/codes/5 array/print_continuous_sequence_sum.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5 array/print_continuous_sequence_sum.c" rename to 9 Algorithms Job Interview/codes/5 array/print_continuous_sequence_sum.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" b/9 Algorithms Job Interview/codes/5.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/5.c" rename to 9 Algorithms Job Interview/codes/5.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6 matrix/print_matrix.c" b/9 Algorithms Job Interview/codes/6 matrix/print_matrix.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/6 matrix/print_matrix.c" rename to 9 Algorithms Job Interview/codes/6 matrix/print_matrix.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7 bianrytree/binary_search.c" b/9 Algorithms Job Interview/codes/7 bianrytree/binary_search.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7 bianrytree/binary_search.c" rename to 9 Algorithms Job Interview/codes/7 bianrytree/binary_search.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" b/9 Algorithms Job Interview/codes/7 bianrytree/bt1.c similarity index 71% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" rename to 9 Algorithms Job Interview/codes/7 bianrytree/bt1.c index 8816c9e..7e72477 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/bt1.c" +++ b/9 Algorithms Job Interview/codes/7 bianrytree/bt1.c @@ -3,11 +3,9 @@ 二叉查找树变成双向链表 */ -strcut BSTreeNode{ - +typedef struct BSTreeNode{ int m_nValue; - BSTreeNode *m_pLeft,m_pRight; - + struct BSTreeNode *m_pLeft, *m_pRight; }BSTree; void convertDoubleLinks(BSTree *root){ diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" b/9 Algorithms Job Interview/codes/7.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/7.c" rename to 9 Algorithms Job Interview/codes/7.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" b/9 Algorithms Job Interview/codes/8.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/8.c" rename to 9 Algorithms Job Interview/codes/8.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" b/9 Algorithms Job Interview/codes/c1.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c1.c" rename to 9 Algorithms Job Interview/codes/c1.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" b/9 Algorithms Job Interview/codes/c10.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c10.c" rename to 9 Algorithms Job Interview/codes/c10.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" b/9 Algorithms Job Interview/codes/c11-2.c similarity index 90% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" rename to 9 Algorithms Job Interview/codes/c11-2.c index fda7caf..e5c3e4b 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11-2.c" +++ b/9 Algorithms Job Interview/codes/c11-2.c @@ -12,7 +12,7 @@ int main() { char ch = 'a'; - foobar1(33, ch); + foobar1(); foobar2(); return 0; } diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" b/9 Algorithms Job Interview/codes/c11.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c11.c" rename to 9 Algorithms Job Interview/codes/c11.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" b/9 Algorithms Job Interview/codes/c12.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c12.c" rename to 9 Algorithms Job Interview/codes/c12.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" b/9 Algorithms Job Interview/codes/c13-1.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-1.c" rename to 9 Algorithms Job Interview/codes/c13-1.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" b/9 Algorithms Job Interview/codes/c13-2.c similarity index 85% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" rename to 9 Algorithms Job Interview/codes/c13-2.c index 7b8ea97..cbb3ff5 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c13-2.c" +++ b/9 Algorithms Job Interview/codes/c13-2.c @@ -1,9 +1,8 @@ #include "c13-1.c" - extern int *arr; + int main() { - arr[1] = 100; return 0; } diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" b/9 Algorithms Job Interview/codes/c14.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c14.c" rename to 9 Algorithms Job Interview/codes/c14.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" b/9 Algorithms Job Interview/codes/c15.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c15.c" rename to 9 Algorithms Job Interview/codes/c15.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" b/9 Algorithms Job Interview/codes/c16.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c16.c" rename to 9 Algorithms Job Interview/codes/c16.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" b/9 Algorithms Job Interview/codes/c17.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c17.c" rename to 9 Algorithms Job Interview/codes/c17.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" b/9 Algorithms Job Interview/codes/c18.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c18.c" rename to 9 Algorithms Job Interview/codes/c18.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" b/9 Algorithms Job Interview/codes/c19.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c19.c" rename to 9 Algorithms Job Interview/codes/c19.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" b/9 Algorithms Job Interview/codes/c2.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c2.c" rename to 9 Algorithms Job Interview/codes/c2.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" b/9 Algorithms Job Interview/codes/c20.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c20.c" rename to 9 Algorithms Job Interview/codes/c20.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" b/9 Algorithms Job Interview/codes/c3.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c3.c" rename to 9 Algorithms Job Interview/codes/c3.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" b/9 Algorithms Job Interview/codes/c4.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c4.c" rename to 9 Algorithms Job Interview/codes/c4.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" b/9 Algorithms Job Interview/codes/c5.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c5.c" rename to 9 Algorithms Job Interview/codes/c5.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" b/9 Algorithms Job Interview/codes/c6.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c6.c" rename to 9 Algorithms Job Interview/codes/c6.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" b/9 Algorithms Job Interview/codes/c7.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c7.c" rename to 9 Algorithms Job Interview/codes/c7.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" b/9 Algorithms Job Interview/codes/c8.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c8.c" rename to 9 Algorithms Job Interview/codes/c8.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" b/9 Algorithms Job Interview/codes/c9.c similarity index 100% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/c9.c" rename to 9 Algorithms Job Interview/codes/c9.c diff --git "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" b/9 Algorithms Job Interview/codes/most_visit_ip.c similarity index 99% rename from "9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" rename to 9 Algorithms Job Interview/codes/most_visit_ip.c index 5c64dca..8ca03fd 100644 --- "a/9 Algorithms Job Interview/\346\265\213\350\257\225\344\273\243\347\240\201/most_visit_ip.c" +++ b/9 Algorithms Job Interview/codes/most_visit_ip.c @@ -8,17 +8,12 @@ #define test_file_path "./ip.txt" #define ip_count 100000000 //随机1亿个IP #define tmp_file_count 32 - #define mem_count 128*1024*1028 //128MB个IP空间 - int hash(unsigned i){ - return i>>27; - } - int main(){ @@ -52,9 +47,6 @@ int main(){ } } - - - //开始读测试数据IP,按IP,映射到32个文件中 FILE *testfd = fopen(test_file_path2,"r"); if (!testfd) @@ -76,8 +68,6 @@ int main(){ } - - // 依次读入每个文件并统计, hash_map 统计每个区间段的最大IP int hash_map[mem_count]; int max_ip; From 5c7f6e625ce106354d47d54c8dba9a50e2101bed Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 18 Aug 2021 19:40:04 +0800 Subject: [PATCH 073/151] update frm --- "0 Numeral/\346\225\260\345\200\274.md" | 4 ++++ ...222\214 \345\260\217\351\241\266\345\240\206.md" | 5 +++++ ...\217\215\345\220\221\347\264\242\345\274\225.md" | 6 +++--- .../\345\271\266\346\237\245\351\233\206.md" | 1 + "5 Graph/DFS \345\222\214 BFS.md" | 4 ++++ ...\213\223\346\211\221\346\216\222\345\272\217.md" | 4 ++++ ...\260\217\347\224\237\346\210\220\346\240\221.md" | 4 ++++ ...\234\200\347\237\255\350\267\257\345\276\204.md" | 1 + 7 Search/README.md | 13 +++++++------ ...\225\260\345\200\274\351\227\256\351\242\230.md" | 5 ----- 10 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 "0 Numeral/\346\225\260\345\200\274.md" create mode 100644 "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" create mode 100644 "4 Tree/92-\345\271\266\346\237\245\351\233\206/\345\271\266\346\237\245\351\233\206.md" create mode 100644 "5 Graph/DFS \345\222\214 BFS.md" create mode 100644 "5 Graph/\346\213\223\346\211\221\346\216\222\345\272\217.md" create mode 100644 "5 Graph/\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221.md" create mode 100644 "5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" diff --git "a/0 Numeral/\346\225\260\345\200\274.md" "b/0 Numeral/\346\225\260\345\200\274.md" new file mode 100644 index 0000000..e15e89e --- /dev/null +++ "b/0 Numeral/\346\225\260\345\200\274.md" @@ -0,0 +1,4 @@ +# 数值 + + + diff --git "a/4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" "b/4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" new file mode 100644 index 0000000..16bb213 --- /dev/null +++ "b/4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" @@ -0,0 +1,5 @@ +# 大顶堆 和 小顶堆 + + + + diff --git "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" index 7665d81..031c7dd 100644 --- "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" +++ "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" @@ -1,13 +1,13 @@ # 反向索引 + +正排索引如 mysql中的索引实现 ,通常使用 B+ 树实现。 反向索引如何来实现呢? + ### 应用场景 * ES * 推荐内容召回 -* mysql中的索引实现 - -通常使用 B+ 树实现。 diff --git "a/4 Tree/92-\345\271\266\346\237\245\351\233\206/\345\271\266\346\237\245\351\233\206.md" "b/4 Tree/92-\345\271\266\346\237\245\351\233\206/\345\271\266\346\237\245\351\233\206.md" new file mode 100644 index 0000000..4b9a111 --- /dev/null +++ "b/4 Tree/92-\345\271\266\346\237\245\351\233\206/\345\271\266\346\237\245\351\233\206.md" @@ -0,0 +1 @@ +# 并查集 \ No newline at end of file diff --git "a/5 Graph/DFS \345\222\214 BFS.md" "b/5 Graph/DFS \345\222\214 BFS.md" new file mode 100644 index 0000000..cbfbc4a --- /dev/null +++ "b/5 Graph/DFS \345\222\214 BFS.md" @@ -0,0 +1,4 @@ +# DFS 和 BFS + + + diff --git "a/5 Graph/\346\213\223\346\211\221\346\216\222\345\272\217.md" "b/5 Graph/\346\213\223\346\211\221\346\216\222\345\272\217.md" new file mode 100644 index 0000000..9ebb39d --- /dev/null +++ "b/5 Graph/\346\213\223\346\211\221\346\216\222\345\272\217.md" @@ -0,0 +1,4 @@ +# 拓扑排序 + + + diff --git "a/5 Graph/\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221.md" "b/5 Graph/\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221.md" new file mode 100644 index 0000000..5570c30 --- /dev/null +++ "b/5 Graph/\346\234\200\345\260\217\347\224\237\346\210\220\346\240\221.md" @@ -0,0 +1,4 @@ +# 最小生成树 + + + diff --git "a/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" "b/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" new file mode 100644 index 0000000..38713e8 --- /dev/null +++ "b/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" @@ -0,0 +1 @@ +# 最短路径 \ No newline at end of file diff --git a/7 Search/README.md b/7 Search/README.md index 2fcf2a5..dc21623 100644 --- a/7 Search/README.md +++ b/7 Search/README.md @@ -1,5 +1,5 @@ -### 查找算法 +# 查找算法 * 顺序查找 * 二分查找 @@ -8,11 +8,11 @@ * 哈希表 -#### 顺序查找 +## 顺序查找 顺序表查找。复杂度O(n) -#### 二分查找 +## 二分查找 有序表中查找我们可以使用二分查找。 @@ -37,16 +37,17 @@ int binary_search(int *a,int length,int k){ } ``` -#### 分块查找 +## 分块查找 块内无序,块之间有序;可以先二分查找定位到块,然后再到块中顺序查找。 -#### 动态查找 +## 动态查找 这里之所以叫 动态查找表,是因为表结构是查找的过程中动态生成的。查找结构通常是二叉排序树,AVL树,B- ,B+等。这部分的内容可以去看『二叉树』章节 -#### 哈希表 + +## 哈希表 哈希表以复杂度O(1)的成绩位列所有查找算法之首,大量查找的数据结构中都可以看到哈希表的应用。 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 8bbf596..558598d 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -6,11 +6,6 @@ * 大数问题 -## int转二进 - - - - ## 求1+2+…+n 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 From 573f5b38115fb17bd74f54dbe7986e9eaad2d823 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 29 Aug 2021 22:40:12 +0800 Subject: [PATCH 074/151] add base58 --- 0 Numeral/base58.md | 20 ++++++++++++++++++++ 1 String/README.md | 7 +++++++ 2 files changed, 27 insertions(+) create mode 100644 0 Numeral/base58.md diff --git a/0 Numeral/base58.md b/0 Numeral/base58.md new file mode 100644 index 0000000..4316c6d --- /dev/null +++ b/0 Numeral/base58.md @@ -0,0 +1,20 @@ +# base58 + +btc中 base58编码表是 + +``` +123456789 abcdefg hijk mn opqrst uvwxyz ABCDEFG HJ KLMN PQRST UVWXYZ +``` + + +相比 base64 去掉了 6个字符, 数字0, 大写字母 O, 大写字母 I (小写i) , 小写字母 l (大写L), 以及 + 和 / + + + +### 编码实现 + +``` + +``` + + diff --git a/1 String/README.md b/1 String/README.md index 72f6792..649d321 100644 --- a/1 String/README.md +++ b/1 String/README.md @@ -15,6 +15,13 @@ * 游程编码 + +## 查找 + +* KMP +* BM + + ## 参考 《Algorithms》 From 92d58f76b14c90e811dcd1705d1e4e6355518f66 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 1 Sep 2021 10:08:04 +0800 Subject: [PATCH 075/151] update linkedHashmap --- 3 Hash Table/LinkedHashMap.md | 32 ++++++++++--------- ...60\345\200\274\351\227\256\351\242\230.md" | 23 +++++++++++-- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/3 Hash Table/LinkedHashMap.md b/3 Hash Table/LinkedHashMap.md index 1144974..6f0bc74 100644 --- a/3 Hash Table/LinkedHashMap.md +++ b/3 Hash Table/LinkedHashMap.md @@ -2,12 +2,18 @@ java 中 LinkedHashmap的实现原理。LinkedHashmap继承自 HashMap。 -HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致。 迭代顺序与插入顺序一致,这种叫做 插入有序。 +HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致。LinkedHashMap 是有序的, 迭代顺序与插入顺序一致,这种叫做 插入有序。 + + +``` +``` + #### 特点 * 维护一个所有entry的双向链表 -* 构造函数 有一个 accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); 其中,访问顺序比较适合做 LRU 缓存 +* 构造函数 有一个 accessOrder 参数,控制访问顺序 (插入顺序 和 访问顺序); +* 访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。这个特性非常适合 LRU 缓存 (最近最少使用); #### 引用场景 @@ -34,28 +40,24 @@ public class LinkedHashMap transient LinkedHashMap.Entry tail; - } -``` - - -## 用LinkedHashMap实现LRU - - -构造函数如下 - -``` -public LinkedHashMap(int initialCapacity, + //构造函数如下, + public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; } + + } ``` -accessOrder 是访问顺序,默认为插入顺序(false), true 代表访问顺序。 +## 用LinkedHashMap实现LRU + + +构造函数中 accessOrder 参数是控制LinkedHashMap 访问顺序,默认为插入顺序(false), true 代表访问顺序。 -访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。 这个特性非常适合 LRU 缓存 (最近最少使用) ; +访问顺序的意思是,当有一个entry被访问以后,这个entry就被移动到链表的表尾。 这个特性非常适合 LRU 缓存 (最近最少使用) ; 插入逻辑,运行自定义删除最老entry的逻辑 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 558598d..224bffc 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -10,10 +10,24 @@ 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 +思路:这是等差数列求和公式, 1+2+3.......+N =(n+1)n/2 + 分析: 1. 不能使用循环,那就用递归 2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句 +``` +int (n){ + int sum=0; + (n>0) && sum=n+factorial(n-1) + return sum; +} +``` + + +## 大数阶乘(factorial) + + ``` int factorial(n){ int sum=0; @@ -23,6 +37,8 @@ int factorial(n){ ``` + + ## 整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 @@ -79,13 +95,16 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; ## ipv4 转 int -比如: 10.67.81.35 , 转为int 为 +比如: 127.0.0.1 , 转为int 为 (01111111 00000000 00000000 00000001) 思路: + ``` -代码 +int toInt(){ + +} ``` 那么,int 转 ipv4 如何解呢? From fef7f3756f6d2542e94d732f514f2f3dddb37e19 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 1 Sep 2021 10:27:18 +0800 Subject: [PATCH 076/151] update linkedHashmap --- 3 Hash Table/LinkedHashMap.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/3 Hash Table/LinkedHashMap.md b/3 Hash Table/LinkedHashMap.md index 6f0bc74..515225a 100644 --- a/3 Hash Table/LinkedHashMap.md +++ b/3 Hash Table/LinkedHashMap.md @@ -6,6 +6,24 @@ HashMap是无序的,迭代访问顺序并不一定与插入(put)顺序一致 ``` +//插入有序 + Map linkedHashMap = new LinkedHashMap<>(); + linkedHashMap.put("name1", "josan1"); + linkedHashMap.put("name2", "josan2"); + linkedHashMap.put("name3", "josan3"); + Set> set = linkedHashMap.entrySet(); + Iterator> iterator = set.iterator(); + while(iterator.hasNext()) { + Entry entry = iterator.next(); + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + System.out.println("key:" + key + ",value:" + value); + } + +output: +key:name1, value:josan1 +key:name2, value:josan2 +key:name3, value:josan3 ``` From 6410f794e1b7e876921196b01e08b458d121df1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Tue, 7 Sep 2021 23:35:59 +0800 Subject: [PATCH 077/151] update link --- 1 String/java String.md | 9 +++++++++ README.md | 9 +++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 1 String/java String.md diff --git a/1 String/java String.md b/1 String/java String.md new file mode 100644 index 0000000..a837aad --- /dev/null +++ b/1 String/java String.md @@ -0,0 +1,9 @@ +# java String + +Java 中 String 实现。 + + +``` + +``` + diff --git a/README.md b/README.md index 24c5c51..bb9920e 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,18 @@ * 链表 * 双向链表 + +## 队列 -### 哈希表/散列表 (Hash Table) +* 队列 +* 堆栈 + +### [哈希表/散列表 (Hash Table)](3\ Hash\ Table/README.md) * 散列函数 * 碰撞解决 -### 字符串算法 +### [字符串算法](1\ String/README.md) * 排序 * 查找 From 94a12c1651e41095d2e0d263f80f7741ec5912d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Tue, 7 Sep 2021 23:41:23 +0800 Subject: [PATCH 078/151] update readme --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bb9920e..a920648 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ * 队列 * 堆栈 -### [哈希表/散列表 (Hash Table)](3\ Hash\ Table/README.md) +### [哈希表/散列表(Hash Table)](3 Hash Table/README.md) * 散列函数 * 碰撞解决 @@ -93,7 +93,7 @@ * 顺序表查找:顺序查找 * 有序表查找:二分查找 * 分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到`块`中顺序查找 -* 动态查找: 二叉排序树,AVL树,B- ,B+ (这里之所以叫 `动态查找表`,是因为表结构是查找的过程中动态生成的) +* 动态查找: 二叉排序树,AVL树,B- ,B+(这里之所以叫 `动态查找表`,是因为表结构是查找的过程中动态生成的) * 哈希表: O(1) @@ -110,10 +110,9 @@ * Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的) * 遗传算法 * 启发式搜索 -* 图像特征提取之SIFT算法 +* 图像特征提取之 SIFT 算法 * 傅立叶变换 -* SPFA(shortest path faster algorithm) 单元最短路径算法 - +* SPFA(shortest path faster algorithm) 单元最短路径算法 ## 海量数据处理 From 16c909371ae2afc251237000b3a915a03ec9ab30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Tue, 7 Sep 2021 23:42:35 +0800 Subject: [PATCH 079/151] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a920648..eafe49d 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ * 链表 * 双向链表 -## 队列 +### 队列 * 队列 * 堆栈 @@ -32,7 +32,7 @@ * 散列函数 * 碰撞解决 -### [字符串算法](1\ String/README.md) +### [字符串算法](./1\ String/README.md) * 排序 * 查找 From 05fdc2defe5eecbe2a32abfabae3f3cb11921eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Tue, 7 Sep 2021 23:44:36 +0800 Subject: [PATCH 080/151] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eafe49d..8be7763 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ * 队列 * 堆栈 -### [哈希表/散列表(Hash Table)](3 Hash Table/README.md) +### [哈希表/散列表(Hash Table)](3%20Hash%20Table/README.md) * 散列函数 * 碰撞解决 From 2935ac22bc6e50a553895b08a37abed2bde9ae38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Tue, 7 Sep 2021 23:59:20 +0800 Subject: [PATCH 081/151] add link --- 1 String/README.md | 4 +- 2 List/Queue.md | 6 +++ 2 List/README.md | 1 + README.md | 95 ++++++++++++++++++++++++++-------------------- 4 files changed, 62 insertions(+), 44 deletions(-) create mode 100644 2 List/Queue.md diff --git a/1 String/README.md b/1 String/README.md index 649d321..f6d73e3 100644 --- a/1 String/README.md +++ b/1 String/README.md @@ -1,5 +1,4 @@ - -## 字符串 +# 字符串 字符串在计算机中的应用非常广泛,这里讨论有关字符串的最重要的算法: @@ -15,6 +14,7 @@ * 游程编码 +[Java中 String实现 参考这里](java%20String.md) ## 查找 diff --git a/2 List/Queue.md b/2 List/Queue.md new file mode 100644 index 0000000..5a2334d --- /dev/null +++ b/2 List/Queue.md @@ -0,0 +1,6 @@ +# 队列 Queue + + + + + diff --git a/2 List/README.md b/2 List/README.md index 35539af..680e6c5 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -39,6 +39,7 @@ typedef struct Entry{ 最后一个节点指针指向头节点的链表 + ## 双向循环链表 diff --git a/README.md b/README.md index 8be7763..2b492ab 100644 --- a/README.md +++ b/README.md @@ -17,12 +17,12 @@ 这些算法全部自己敲一遍: -### 链表 +### [链表](2%20List/README.md) * 链表 * 双向链表 -### 队列 +### [队列](2%20List/Queue.md) * 队列 * 堆栈 @@ -32,7 +32,7 @@ * 散列函数 * 碰撞解决 -### [字符串算法](./1\ String/README.md) +### [字符串算法](1%20String/README.md) * 排序 * 查找 @@ -43,7 +43,7 @@ * 数据压缩 -### 树 +### [树](4%20Tree/README.md) * 二叉树 * 二叉查找树 @@ -61,7 +61,7 @@ * 斐波那契堆(Fibonacci Heap) -### 图的算法 +### [图的算法](5%20Graph/README.md) * 图的存储结构和基本操作(建立,遍历,删除节点,添加节点) * 最小生成树 @@ -71,7 +71,7 @@ -### 排序算法 +### [排序算法](6%@0Sort/README.md) **交换排序算法** @@ -88,7 +88,7 @@ * 桶排序 -### 查找算法 +### [查找算法](7%20Search/README.md) * 顺序表查找:顺序查找 * 有序表查找:二分查找 @@ -97,39 +97,7 @@ * 哈希表: O(1) -### 15个经典基础算法 - -* Hash -* 快速排序 -* 快递选择SELECT -* BFS/DFS (广度/深度优先遍历) -* 红黑树 (一种自平衡的`二叉查找树`) -* KMP 字符串匹配算法 -* DP (动态规划 dynamic programming) -* A*寻路算法: 求解最短路径 -* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的) -* 遗传算法 -* 启发式搜索 -* 图像特征提取之 SIFT 算法 -* 傅立叶变换 -* SPFA(shortest path faster algorithm) 单元最短路径算法 - - -## 海量数据处理 - -* Hash映射/分而治之 -* Bitmap -* Bloom filter(布隆过滤器) -* Trie树 -* 数据库索引 -* 倒排索引(Inverted Index) -* 双层桶划分 -* 外排序 -* simhash算法 -* 分布处理之Mapreduce - - -## 算法设计思想 +## [算法设计思想](8%20Algorithms%20Analysis/README.md) * 迭代法 * 穷举搜索法 @@ -140,7 +108,8 @@ * 分治算法 -## 算法题目选编 + +## [面试算法题目](9%20Algorithms%20Job%20Interview/README.md) 这是一个算法题目合集,题目是我从网络和书籍之中整理而来,部分题目已经做了思路整理。问题分类包括: @@ -163,13 +132,55 @@ * 剑指offer -## 开源项目中的算法 +## [海量数据处理](91%20Algorithms%20In%20Big%20Data/README.md) + +* Hash映射/分而治之 +* Bitmap +* Bloom filter(布隆过滤器) +* Trie树 +* 数据库索引 +* 倒排索引(Inverted Index) +* 双层桶划分 +* 外排序 +* simhash算法 +* 分布处理之Mapreduce + + + +## [开源项目中的算法](93%20Algorithms%20In%20Open%20Source/README.md) * YYCache * cocos2d-objc +* bitcoin +* geohash +* kafka +* nginx +* zookeeper * ... + + +## 15个经典基础算法 + +* Hash +* 快速排序 +* 快递选择SELECT +* BFS/DFS (广度/深度优先遍历) +* 红黑树 (一种自平衡的`二叉查找树`) +* KMP 字符串匹配算法 +* DP (动态规划 dynamic programming) +* A*寻路算法: 求解最短路径 +* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的) +* 遗传算法 +* 启发式搜索 +* 图像特征提取之 SIFT 算法 +* 傅立叶变换 +* SPFA(shortest path faster algorithm) 单元最短路径算法 + + + + ## 推荐阅读 ### 刷题必备 From 8117b1016690f2489aa1bb0227cff969a8610605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Wed, 8 Sep 2021 00:27:19 +0800 Subject: [PATCH 082/151] add link --- .../README.md" | 152 ++++++++++++++++++ .../\345\255\227\345\205\270\346\240\221.md" | 148 ----------------- .../\344\274\270\345\261\225\346\240\221.md" | 0 .../\345\220\216\347\274\200\346\240\221.md" | 0 .../7-B\346\240\221/B+\346\240\221.md" | 0 .../7-B\346\240\221/B\346\240\221.md" | 0 .../heap.c" => "4 Tree/8-\345\240\206/heap.c" | 0 .../8-\345\240\206/\345\240\206.md" | 0 .../\347\272\242\351\273\221\346\240\221.md" | 2 +- 4 Tree/README.md | 47 +++++- 10 files changed, 192 insertions(+), 157 deletions(-) delete mode 100644 "4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" rename "4 Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" => "4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" (100%) rename "4 Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" => "4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" (100%) rename "4 Tree/7-B\346\225\260/B+\346\240\221.md" => "4 Tree/7-B\346\240\221/B+\346\240\221.md" (100%) rename "4 Tree/7-B\346\225\260/B\346\240\221.md" => "4 Tree/7-B\346\240\221/B\346\240\221.md" (100%) rename "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" => "4 Tree/8-\345\240\206/heap.c" (100%) rename "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" => "4 Tree/8-\345\240\206/\345\240\206.md" (100%) diff --git "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" index e69de29..cda44ef 100644 --- "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" +++ "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" @@ -0,0 +1,152 @@ +# 字典树trie + +## trie基本 + +`字典树`,英文名`Trie树`,Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”, +又称`单词查找树` 或 `前缀树`,Trie树,是一种树形结构(多叉树)。 + +trie,又称为前缀树或字典树,是一种有序树,用于保存关联数组。 + +1. 除根节点不包含字符,每个节点都包含一个字符 +2. 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串 +3. 每个节点的所有子节点包含的字符都不相同(保证每个节点对应的字符串都不一样) + +比如: + +``` + / \ + / | \ + t a i + / \ \ + o e n + /|\ / + a d n n +``` + +上面的Trie树,可以表示字符串集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。 + +trie树把每个关键字保存在一条路径上,而不是一个节点中 +两个有公共前缀的关键字,在Trie树中前缀部分的路径相同,所以Trie树又叫做前缀树(Prefix Tree)。 + + + +### trie 优缺点 + +它的优点是: + +1. 插入和查询的效率很高,都是O(m),其中 m 是待插入/查询的字符串的长度 +2. Trie树可以对关键字按字典序排序 +3. 利用字符串的公共前缀来最大限度地减少无谓的字符串比较,提高查询效率 + +缺点: + +1. trie 树比较费内存空间,在处理大数据时会内存吃紧 +2. 当hash函数较好时,Hash查询效率比 trie 更优 + +[知乎这里](http://www.zhihu.com/question/27168319)有个问题:`10万个串找给定的串是否存在`, 对trie和hash两种方案给出了讨论。 + + +[DATrie](https://github.com/kmike/datrie) 是使用python实现的双数组trie树, 双数组可以减少内存的使用量 。有关 double-array trie,可以参考[这篇论文](http://linux.thai.net/~thep/datrie/datrie.html) + + +### trie应用 + +典型应用是:前缀查询,字符串查询,排序 + +* 用于统计,排序和保存大量的字符串(但不仅限于字符串) +* 经常被搜索引擎系统用于文本词频统计 +* 排序大量字符串 +* 用于索引结构 +* 敏感词过滤 + + +### 实际应用问题 + +1. 给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置 +分析思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。 + +2. 已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串 + +3. 给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。 +分析:trie树查询单词的应用。先建立N个熟词的前缀树,然后按文章的单词一次查询。 + +4. 给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如,若rob是不良单词,那么文本problem含有不良单词。 +分析:先用不良单词建立trie树,然后过滤文本(每个单词都在trie树上查询,查询的复杂度O(1),效率非常高),这正是`敏感词过滤系统(或垃圾评论系统)`的原理。 + +5. 给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出 +分析:这是trie树排序的典型应用,建立N个单词的trie树,然后线序遍历整个树,就可以达到效果。 + + + + +## trie树存储结构和基本操作 + +最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符如=-*/) +子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存 +如果用链表存储,查询时需要遍历链表,查询效率有所降低 + + + +``` +define ALPHABET_NUM 26 +typedef struct trie_node{ + char value; + bool isKey;/*是否代表一个关键字*/ + int count; /*可用于词频统计,表示关键字出现的次数*/ + struct Node *subTries[ALPHABET]; +}*Trie + +Trie Trie_create(); +int Trie_insert(Trie trie,char *word); // 插入一个单词 +int Trie_search(Trie trie,char *word);// 查找一个单词 +int Trie_delete(Trie trie,char *word);// 删除一个单词 + +Trie Trie_create(){ + trie_node* pNode = new trie_node(); + pNode->count = 0; + for(int i=0; ichildren[i] = NULL; + return pNode; +} + +void trie_insert(trie root, char* key) +{ + trie_node* node = root; + char* p = key; + while(*p) + { + if(node->children[*p-'a'] == NULL) + { + node->children[*p-'a'] = create_trie_node(); + } + node = node->children[*p-'a']; + ++p; + } + node->count += 1; +} + +/** + * 查询:不存在返回0,存在返回出现的次数 + */ +int trie_search(trie root, char* key) +{ + trie_node* node = root; + char* p = key; + while(*p && node!=NULL) + { + node = node->children[*p-'a']; + ++p; + } + + if(node == NULL) + return 0; + else + return node->count; +} + +``` + +trie树的增加和删除都比较麻烦,但索引本身就是写少读多,是否考虑添加删除的复杂度上升,依靠具体场景决定。 + + + diff --git "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" deleted file mode 100644 index 5a33c3a..0000000 --- "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/\345\255\227\345\205\270\346\240\221.md" +++ /dev/null @@ -1,148 +0,0 @@ - - -## 字典树trie - -### trie基本 - -`字典树`,英文名`Trie树`,Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”, -又称`单词查找树` 或 `前缀树`,Trie树,是一种树形结构(多叉树)。 - -trie,又称为前缀树或字典树,是一种有序树,用于保存关联数组。 - -1. 除根节点不包含字符,每个节点都包含一个字符 -2. 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串 -3. 每个节点的所有子节点包含的字符都不相同(保证每个节点对应的字符串都不一样) - -比如: - -``` - / \ - / | \ - t a i - / \ \ - o e n - /|\ / - a d n n -``` - -上面的Trie树,可以表示字符串集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。 - -trie树把每个关键字保存在一条路径上,而不是一个节点中 -两个有公共前缀的关键字,在Trie树中前缀部分的路径相同,所以Trie树又叫做前缀树(Prefix Tree)。 - - -### trie树存储结构和基本操作 - -最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符如=-*/) -子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存 -如果用链表存储,查询时需要遍历链表,查询效率有所降低 - - - -``` -define ALPHABET_NUM 26 -typedef struct trie_node{ - char value; - bool isKey;/*是否代表一个关键字*/ - int count; /*可用于词频统计,表示关键字出现的次数*/ - struct Node *subTries[ALPHABET]; -}*Trie - -Trie Trie_create(); -int Trie_insert(Trie trie,char *word); // 插入一个单词 -int Trie_search(Trie trie,char *word);// 查找一个单词 -int Trie_delete(Trie trie,char *word);// 删除一个单词 - -Trie Trie_create(){ - trie_node* pNode = new trie_node(); - pNode->count = 0; - for(int i=0; ichildren[i] = NULL; - return pNode; -} - -void trie_insert(trie root, char* key) -{ - trie_node* node = root; - char* p = key; - while(*p) - { - if(node->children[*p-'a'] == NULL) - { - node->children[*p-'a'] = create_trie_node(); - } - node = node->children[*p-'a']; - ++p; - } - node->count += 1; -} - -/** - * 查询:不存在返回0,存在返回出现的次数 - */ -int trie_search(trie root, char* key) -{ - trie_node* node = root; - char* p = key; - while(*p && node!=NULL) - { - node = node->children[*p-'a']; - ++p; - } - - if(node == NULL) - return 0; - else - return node->count; -} - -``` - -trie树的增加和删除都比较麻烦,但索引本身就是写少读多,是否考虑添加删除的复杂度上升,依靠具体场景决定。 - - -### trie 问题 - -它的优点是: - -1. 插入和查询的效率很高,都是O(m),其中 m 是待插入/查询的字符串的长度 -2. Trie树可以对关键字按字典序排序 -3. 利用字符串的公共前缀来最大限度地减少无谓的字符串比较,提高查询效率 - -缺点: - -1. trie 树比较费内存空间,在处理大数据时会内存吃紧 -2. 当hash函数较好时,Hash查询效率比 trie 更优 - -[知乎这里](http://www.zhihu.com/question/27168319)有个问题:`10万个串找给定的串是否存在`, 对trie和hash两种方案给出了讨论。 - - -[DATrie](https://github.com/kmike/datrie) 是使用python实现的双数组trie树, 双数组可以减少内存的使用量 。有关 double-array trie,可以参考[这篇论文](http://linux.thai.net/~thep/datrie/datrie.html) - - -### trie应用 - -典型应用是:前缀查询,字符串查询,排序 - -* 用于统计,排序和保存大量的字符串(但不仅限于字符串) -* 经常被搜索引擎系统用于文本词频统计 -* 排序大量字符串 -* 用于索引结构 -* 敏感词过滤 - -### 实际应用问题 - -1. 给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置 -分析思路一:trie树 ,找到这个字符串查询操作就可以了,如何知道出现的第一个位置呢?我们可以在trie树中加一个字段来记录当前字符串第一次出现的位置。 - -2. 已知n个由小写字母构成的平均长度为10的单词,判断其中是否存在某个串为另一个串的前缀子串 - -3. 给出N 个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。 -分析:trie树查询单词的应用。先建立N个熟词的前缀树,然后按文章的单词一次查询。 - -4. 给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如,若rob是不良单词,那么文本problem含有不良单词。 -分析:先用不良单词建立trie树,然后过滤文本(每个单词都在trie树上查询,查询的复杂度O(1),效率非常高),这正是`敏感词过滤系统(或垃圾评论系统)`的原理。 - -5. 给你N 个互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出 -分析:这是trie树排序的典型应用,建立N个单词的trie树,然后线序遍历整个树,就可以达到效果。 - diff --git "a/4 Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" "b/4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" similarity index 100% rename from "4 Tree/5-\344\274\270\345\261\225\346\225\260/\344\274\270\345\261\225\346\240\221.md" rename to "4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" diff --git "a/4 Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" "b/4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" similarity index 100% rename from "4 Tree/6-\345\220\216\347\274\200\346\225\260/\345\220\216\347\274\200\346\240\221.md" rename to "4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" diff --git "a/4 Tree/7-B\346\225\260/B+\346\240\221.md" "b/4 Tree/7-B\346\240\221/B+\346\240\221.md" similarity index 100% rename from "4 Tree/7-B\346\225\260/B+\346\240\221.md" rename to "4 Tree/7-B\346\240\221/B+\346\240\221.md" diff --git "a/4 Tree/7-B\346\225\260/B\346\240\221.md" "b/4 Tree/7-B\346\240\221/B\346\240\221.md" similarity index 100% rename from "4 Tree/7-B\346\225\260/B\346\240\221.md" rename to "4 Tree/7-B\346\240\221/B\346\240\221.md" diff --git "a/4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" "b/4 Tree/8-\345\240\206/heap.c" similarity index 100% rename from "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/heap.c" rename to "4 Tree/8-\345\240\206/heap.c" diff --git "a/4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" "b/4 Tree/8-\345\240\206/\345\240\206.md" similarity index 100% rename from "4 Tree/8-\344\272\214\345\217\211\345\240\206(\344\274\230\345\205\210\351\230\237\345\210\227)/\345\244\247\351\241\266\345\240\206 \345\222\214 \345\260\217\351\241\266\345\240\206.md" rename to "4 Tree/8-\345\240\206/\345\240\206.md" diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index 054a499..c537fcd 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -4,7 +4,7 @@ ### 应用场景 java 中 HashMap、TreeMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 -关于 HashMap 实现解析参考 [这里](.../Hash\ Table/HashMap\ in\ Java.md) +关于 HashMap 实现解析参考 [这里](../../3%20HashTable/HashMap%20in%20Java.md) diff --git a/4 Tree/README.md b/4 Tree/README.md index 96bd546..977ba8a 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -1,20 +1,51 @@ - -## 树🌲 +# 树🌲 介绍树相关的算法 +* 二叉树 * 二叉查找树 -* 赫夫曼编码 Huffman +* AVL树 * 字典树trie(前缀树,单词查找树) * 伸展树 * 后缀树 -* AVL树 +* B树 : B树, B+树(mysql索引使用B+树的数据结构) +* 红黑树 +* 二叉堆(优先队列) * 红黑树 -* B树 -* B+树 mysql索引使用B+树的数据结构 -* B*树 -* R树 * Treap 树 +* 赫夫曼编码 Huffman + + +## [二叉查找树](2-二叉查找树/二叉查找树.md) + + +## [AVL树](3-平衡树AVL/README.md) + + +## [字典树trie](4-字典树Trie/README.md) + +字典树也叫前缀树,单词查找树 + + +## [伸展树](5-伸展树/伸展树.md) + + +## [后缀树](6-后缀树/后缀树.md) + +## B树 + +* [B树](7-B树/B树.md) +* [B+树](7-B树/B+树.md) mysql 索引使用 B+树 的数据结构 + + +## [二叉堆](8-堆/堆.md) + + +## [红黑树](9-红黑树%20R-B%20tree/红黑树.md) + + +## 赫夫曼编码 Huffman + From ad3f27856ffdd315815e3cca6d36b979e09d223a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Wed, 8 Sep 2021 00:27:33 +0800 Subject: [PATCH 083/151] add link --- 2 List/QPS Counter.md | 5 ++++- 2 List/README.md | 7 ++++++- 2 List/Queue.md => 2 Queue/README.md | 0 {2 List => 2 Queue}/ZipList.md | 0 {2 List => 2 Queue}/skip-list.md | 0 3 Hash Table/README.md | 8 ++++++-- README.md | 2 +- 7 files changed, 17 insertions(+), 5 deletions(-) rename 2 List/Queue.md => 2 Queue/README.md (100%) rename {2 List => 2 Queue}/ZipList.md (100%) rename {2 List => 2 Queue}/skip-list.md (100%) diff --git a/2 List/QPS Counter.md b/2 List/QPS Counter.md index 2749960..3411dea 100644 --- a/2 List/QPS Counter.md +++ b/2 List/QPS Counter.md @@ -1,4 +1,7 @@ # QPS Counter 统计各接口QPS计数 -使用一个双向循环链表结构 \ No newline at end of file +使用一个双向循环链表结构 + + + diff --git a/2 List/README.md b/2 List/README.md index 680e6c5..458996f 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -6,7 +6,9 @@ ## 链表 -这个就不介绍了。重点说下双向链表。 +### 应用场景 + +* [redis slowlog](Redis%20slowlog.md) ### 扩缩容 @@ -18,6 +20,8 @@ java 中扩容,每次扩容新增原先容量的 1/2 int newCapacity = oldCapacity + (oldCapacity >> 1); ``` +这个就不介绍了。重点说下双向链表。 + ## 双向链表 @@ -38,6 +42,7 @@ typedef struct Entry{ 最后一个节点指针指向头节点的链表 +[QPS 计数器实现](QPS%20Counter.md) ## 双向循环链表 diff --git a/2 List/Queue.md b/2 Queue/README.md similarity index 100% rename from 2 List/Queue.md rename to 2 Queue/README.md diff --git a/2 List/ZipList.md b/2 Queue/ZipList.md similarity index 100% rename from 2 List/ZipList.md rename to 2 Queue/ZipList.md diff --git a/2 List/skip-list.md b/2 Queue/skip-list.md similarity index 100% rename from 2 List/skip-list.md rename to 2 Queue/skip-list.md diff --git a/3 Hash Table/README.md b/3 Hash Table/README.md index 7738d01..aecec75 100644 --- a/3 Hash Table/README.md +++ b/3 Hash Table/README.md @@ -6,7 +6,11 @@ * 散列函数设计 * 冲突处理 * hashmap数据结构 -* Java 中HashMap实现 + +[Golang 中HashMap实现](HashMap%20in%20Golang.md) +[Java 中HashMap实现](HashMap%20in%20Java.md) +[Java 中LinkedHashMap实现](LinkedHashMap.md) +[Java 中TreeMap实现](TreeMap%20in%20Java.md) 散列表使用某种算法操作(散列函数)将键转化为数组的索引来访问数组中的数据,这样可以通过Key-value的方式来访问数据,达到常数级别的存取效率。现在的nosql数据库都是采用key-value的方式来访问存储数据。 @@ -29,7 +33,7 @@ 散列函数就是将键转化为数组索引的过程。且这个函数应该易于计算且能够均与分布所有的键。 -散列函数最常用的方法是`除留余数法`。这时候被除数应该选用`素数`,这样才能保证键值的均匀散步。 +散列函数最常用的方法是`除留余数法`。这时候被除数应该选用`素数`,这样才能保证键值的均匀散布。 散列函数和键的类型有关,每种数据类型都需要相应的散列函数;比如键的类型是整数,那我们可以直接使用`除留余数法`;这里特别说明下,大多数情况下,键的类型都是字符串,这个时候我们任然可以使用`除留余数法`,将字符串当做一个特别大的整数。 diff --git a/README.md b/README.md index 2b492ab..c8d94dc 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ * 链表 * 双向链表 -### [队列](2%20List/Queue.md) +### [队列](2%20Queue/README.md) * 队列 * 堆栈 From efcfdf74f192bc69ac326fb002a12f02b6ac7b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Wed, 8 Sep 2021 00:31:39 +0800 Subject: [PATCH 084/151] add link --- 6 Sort/README.md | 4 +--- 7 Search/README.md | 1 - 8 Algorithms Analysis/README.md | 17 ++++++++--------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/6 Sort/README.md b/6 Sort/README.md index 62d03a7..91f1b50 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -1,6 +1,4 @@ - - -## 排序算法 +# 排序算法 **排序的稳定性** 是指对于相等的元素,排序之后,任然保存2个元素的位置没有变,就是稳定的排序,反之就是不稳定排序。 diff --git a/7 Search/README.md b/7 Search/README.md index dc21623..0c213e9 100644 --- a/7 Search/README.md +++ b/7 Search/README.md @@ -1,4 +1,3 @@ - # 查找算法 * 顺序查找 diff --git a/8 Algorithms Analysis/README.md b/8 Algorithms Analysis/README.md index 3aaddf0..e207896 100644 --- a/8 Algorithms Analysis/README.md +++ b/8 Algorithms Analysis/README.md @@ -1,16 +1,15 @@ - -## 算法分析思路 +# 算法分析思路 详细介绍每一种算法设计的思路,并为每种方法给出一个经典案例的详细解读,总结对应设计思路,最后给出其它案例,以供参考。 -* 迭代法 -* 穷举搜索法 -* 动态规划 -* 贪心算法 -* 回溯法 -* 分治算法 -* 递归 +* [迭代法](迭代法.md) +* [穷举搜索法](穷举搜索法.md) +* [动态规划](动态规划.md) +* [贪心算法](贪心算法.md) +* [回溯法](回溯法.md) +* [分治算法](分治算法.md) +* [递归](递归.md) From f7519fdbd5e995f07c98761391f659b79fe79359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Wed, 8 Sep 2021 00:35:05 +0800 Subject: [PATCH 085/151] add link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c8d94dc..0f91d4d 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ * 队列 * 堆栈 -### [哈希表/散列表(Hash Table)](3%20Hash%20Table/README.md) +### [哈希表 HashTable](3%20Hash%20Table/README.md) * 散列函数 * 碰撞解决 @@ -71,7 +71,7 @@ -### [排序算法](6%@0Sort/README.md) +### [排序算法](6%20Sort/README.md) **交换排序算法** From b89c744825958ac75a047e8dca15844c9c3e6bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Wed, 8 Sep 2021 00:45:07 +0800 Subject: [PATCH 086/151] add link --- ...1 \345\255\227\347\254\246\344\270\262.md" | 2 +- .../2 \351\223\276\350\241\250.md" | 1 + ...3 \345\240\206\345\222\214\346\240\210.md" | 1 - ...60\345\200\274\351\227\256\351\242\230.md" | 1 + ...60\345\210\227\351\227\256\351\242\230.md" | 1 + .../6 \347\237\251\351\230\265.md" | 2 +- ...7 \344\272\214\345\217\211\346\240\221.md" | 1 + .../8 \345\233\276.md" | 2 +- ...35\347\273\264\350\256\255\347\273\203.md" | 1 + ...73\347\273\237\350\256\276\350\256\241.md" | 2 +- 9 Algorithms Job Interview/README.md | 38 +++++++------------ .../\345\211\221\346\214\207offer/README.md" | 1 + .../README.md" | 1 + ...60\346\215\256\345\244\204\347\220\206.md" | 20 +++++----- 14 files changed, 35 insertions(+), 39 deletions(-) diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index 30960ee..5cd0f41 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -1,4 +1,4 @@ - +# 字符串 字符串常见的问题: diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 900e73b..0aebc1a 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -1,3 +1,4 @@ +# 链表 链表常常碰到的问题有: diff --git "a/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" index 35f5638..1ce24fa 100644 --- "a/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" +++ "b/9 Algorithms Job Interview/3 \345\240\206\345\222\214\346\240\210.md" @@ -1,4 +1,3 @@ - # 堆和栈 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 224bffc..e190fc8 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -1,3 +1,4 @@ +# 数值问题 这部分都是一些数学几何计算方面的问题。主要由: diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index 79890a9..9dcf99b 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -1,3 +1,4 @@ +# 数组数列问题 这部分的问题都集中在数据集合上。主要有: diff --git "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" index fe347cb..9452412 100644 --- "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" +++ "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" @@ -1,4 +1,4 @@ - +# 矩阵 矩阵在计算机中表示就是二维数组。这部分内容都是有关二维数组和矩阵相关的题目。 diff --git "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" index d51391d..065c72d 100644 --- "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" +++ "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" @@ -1,3 +1,4 @@ +# 二元树 问题涉及有: diff --git "a/9 Algorithms Job Interview/8 \345\233\276.md" "b/9 Algorithms Job Interview/8 \345\233\276.md" index 25f22c0..7bce7e4 100644 --- "a/9 Algorithms Job Interview/8 \345\233\276.md" +++ "b/9 Algorithms Job Interview/8 \345\233\276.md" @@ -1,4 +1,4 @@ - +# 图 深度优先遍历(DFS)和广度优先遍历(BFS) 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中 diff --git "a/9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" "b/9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" index 0c70ff0..0a48180 100644 --- "a/9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" +++ "b/9 Algorithms Job Interview/9 \346\231\272\345\212\233\346\200\235\347\273\264\350\256\255\347\273\203.md" @@ -1,3 +1,4 @@ +# 智力题 这部分内容的题目侧重思维发散。 diff --git "a/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" "b/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" index 6dfba5d..689718c 100644 --- "a/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" +++ "b/9 Algorithms Job Interview/91 \347\263\273\347\273\237\350\256\276\350\256\241.md" @@ -1,4 +1,4 @@ - +# 系统设计 ## 要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。 diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index d63cebd..bb16b4c 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -1,8 +1,9 @@ +# 面试题 这部分内容是算法问题合集,题目大多来自网络和书籍。我做了下简单的整理,很多题做了一些思路标记。 -### 字符串 +## [字符串](1%20字符串.md) 计算机处理的数据除了数值,就是字符。字符处理的常见问题包括: @@ -15,7 +16,7 @@ -### 链表 +## [链表](2%20链表) 链表处理的常见问题包括: @@ -26,13 +27,13 @@ * 2个链表合并 -### 栈和队列 +## [栈和队列](3%20堆和栈.md) 这是最基本数据结构,相对容易理解。 -### 数值问题 +## [数值问题](4%20数值问题.md) 这部分都是一些数学几何计算方面的问题。 主要有: @@ -41,7 +42,7 @@ * 大数问题 -### 数组数列问题 +## [数组数列问题](5%20数组数列问题.md) 这部分的问题都集中在数据集合上。主要有: @@ -52,12 +53,12 @@ * 多个数组合并,交集 -### 矩阵 +## [矩阵](6%20矩阵.md) 这部分都是矩阵和二维数组相关的问题。 -### 二叉树 +## [二叉树](7%20二叉树.md) * 遍历 @@ -66,37 +67,24 @@ -### 图 +## [图](8%20图.md) 图相关的问题 -### 海量数据处理 +## 智力思维训练 -海量处理问题常用的分析解决问题的思路是: -* Hash映射/分而治之 -* Bitmap -* Bloom filter(布隆过滤器) -* Trie树 -* 数据库索引 -* 倒排索引(Inverted Index) -* 双层桶划分 -* 外排序 -* simhash算法 -* 分布处理之Mapreduce -### 《剑指offer》 - -《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 +## [《剑指offer》](剑指offer/README.md) -### 《编程之美》 +《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 -### 智力思维训练 +## [《编程之美》](编程之美/README.md) diff --git "a/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" index dcee0d5..3af28f4 100644 --- "a/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" +++ "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" @@ -1,3 +1,4 @@ +# 《剑指offer》 《剑指offer》 这本书给出了50到面试题,涉及到字符串处理,堆栈,链表,二叉树等问题的处理。 diff --git "a/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" "b/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" index a9d3bd3..902db80 100644 --- "a/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" +++ "b/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" @@ -1,3 +1,4 @@ +#《编程之美》 书中的内容分为4个部分: diff --git "a/91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" index 62c64aa..02229d3 100644 --- "a/91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" +++ "b/91 Algorithms In Big Data/\346\265\267\351\207\217\346\225\260\346\215\256\345\244\204\347\220\206.md" @@ -1,6 +1,4 @@ - - -## 海量数据处理 +# 海量数据处理 这部分内容是海量数据处理的问题。所谓海量: @@ -9,12 +7,16 @@ 海量处理问题常用的分析解决问题的思路是: -1. 分而治之/Hash映射 + hash统计/trie树/红黑树/二叉搜索树 + 堆排序/快速排序/归并排序 -2. 双层桶划分 -3. Bloom filter 、Bitmap -4. Trie树/数据库/倒排索引 -5. 外排序 -6. 分布处理之 Hadoop/Mapreduce +* Hash映射/分而治之 + hash统计/trie树/红黑树/二叉搜索树 + 堆排序/快速排序/归并排序 +* Bitmap +* Bloom filter +* Trie树 +* 数据库索引 +* 倒排索引(Inverted Index) +* 双层桶划分 +* 外排序 +* simhash算法 +* 分布处理之Hadoop/Mapreduce From f7910d8d4ac26cf95df574561bbd02c6f942c0f6 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 8 Sep 2021 11:08:24 +0800 Subject: [PATCH 087/151] update jz offer --- .../\345\211\221\346\214\207offer/README.md" | 491 ++++++++++-------- 1 file changed, 279 insertions(+), 212 deletions(-) diff --git "a/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" index 3af28f4..9f556e3 100644 --- "a/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" +++ "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" @@ -8,273 +8,211 @@ * 本书完整源代码在: -### 赋值运算符函数 -### 实现Singleton模式 +# 数值 -### 二维数组中的查找 +### 二进制中1的个数 -二维数组中每一行从左到右递增,每一列从上到下递增,判断数组中是否包含该整数。 +输入一个整数,输出该数二进制中1出现的次数。比如9的二进制 10001,输出是2 + +`n=n&n-1` ``` -bool find(int *matrix,int rows,int columns,int numbers) +int one_appear_count(int n) ``` +### 数值的整数次方 -### 替换空格 - -如把字符串中的每个空格替换成`%20` - -`二遍扫描` +要求不得使用库函数。这里注意考虑指数是0和负数的情况 ``` -void replace_blank(char *str); +double power(double base,int exponent) ``` -### 从尾到头打印链表 +### 打印1到最大的n位数 -`栈` +比如n=3,就打印1到999 ``` -void print_reversing(LinkList *head) +void print_to_max_with_length(int n) ``` -### 重建二叉树 +### 求 1+2+...+n + +要求不用乘除法,for/while/if/else/switch等关键字及条件判断语句 -输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树 ``` -BinaryTree *construct(int *preorder,int inroder,int length); +long long sum(unsigned int n); ``` +### 不用加减乘除做加法 -### 用两个栈实现队列 - -队列就是在尾部插入节点,头部删除节点。 - +求2个整数之和 -### 旋转数组的最小数字 +`位运算` -旋转数组是指把一个数组最开始的若干个元素搬到数组的末尾。输入一个递增排序的数组的旋转,比如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转。求该数组的最小值。 ``` -int min(int *num, int length) +int sum(int,int) ``` -### 菲波那切数列 - -``` -long long fabonacci(unsigned n) -``` -### 二进制中1的个数 +### 丑数 -输入一个整数,输出该数二进制中1出现的次数。比如9的二进制 10001,输出是2 +> 只包含因子 2,3,5的数叫做丑数;比如 6(2x3), 8(2x2x2) 是丑数(ugly number) -`n=n&n-1` +求按从小到大的顺序,第1500个丑数 ``` -int one_appear_count(int n) +int ugly(int n) ``` -### 数值的整数次方 -要求不得使用库函数。这里注意考虑指数是0和负数的情况 -``` -double power(double base,int exponent) -``` +### 把字符串转换成整数 +比如 "12343567754" -> 12343567754 -### 打印1到最大的n位数 -比如n=3,就打印1到999 +`NULL,空串,正负号,溢出` + ``` -void print_to_max_with_length(int n) +int strToInt(char str); ``` -### 在O(1)时间删除链表节点 - -已经有一个头节点指针,还有一个指向改删除节点的指针 -`用下一个节点的内容覆盖当前删除节点的内容,删除下一个节点` -``` -void deleteNode(LinkList *head,LinkList *targetToDelete); -``` +# 字符串 -### 调整数组顺序使奇数位于偶数前面 -调整后,所有奇数在前半部分,偶数在后半部分 +### 替换空格 -`两边向中间扫描` +如把字符串中的每个空格替换成`%20` +`二遍扫描` ``` -void reorder(int *data,int length) +void replace_blank(char *str); ``` -### 输出链表中倒数第K个节点 - -`使用两个指针,一个先走k-1步` - -``` -void print_lastK(LinkList *head); -``` +### 第一个只出现一次的字符 -### 反转链表 +在字符串中查找第一个只出现一次的字符 -`三个指针` +`哈希表:值为出现的次数` `二次扫描` ``` -void reverse(LinkList *head); +char find_appear_once_char(char *string) ``` -反转二叉树呢? +### 字符串的排列 -### 合并2个排序的链表 - -要求合并以后链表任然排序 +输入一个字符串,打印该字符串中字符的所有排列 -`递归` +`递归,分解` ``` -LinkList *merge(LinkList *one,LinkList *two); +void print_full_permutation(char *string) ``` -### 树的子结构 -考察二叉树的基本操作。输入2课二叉树A和B,判断B是不是A的子结构。 +### 反转单词顺序 VS 左旋转字符串 -``` -struct BinaryTreeNode{ - int m_value; - BinaryTreeNode *m_pleft; - BinaryTreeNode *m_pRight; -} -``` +a. 翻转句子中单词的顺序,但单词内字符不变。如 『I am a student』 -> 『student. a am I』 + +`先以单词为单位翻转,整个句子再次翻转` ``` - 8 - / \ 10 - / \ / \ - 6 10 子结构 11 9 - / \ / \ - 5 7 9 11 +char *reverse_by_word(char *string) ``` +b. 左旋转字符串是把字符串其那面的若干位转义到字符串的尾部。比如"abcedfsz"和数字2,结果是"cedfszab" + ``` -bool subTree(BinaryTreeNode *root1,BinaryTreeNode *root2); +char *left_rotate_string(char *s,int n) ``` -### 二叉树翻转 - -``` - 8 8 - / \ / \ - / \ / \ - 6 10 翻转后 10 6 - / \ / \ / \ / \ - 5 7 9 11 11 9 7 5 -``` - -`交换每个节点的左右子树` +# 链表 -``` -void reverse(BinaryTreeNode *root); -``` +### 从尾到头打印链表 -### 从外向里顺时针打印矩阵 +`栈` ``` -void print_matrix_clockwise(int *matrix,int cols,int rows); +void print_reversing(LinkList *head) ``` -延伸:按大小顺序打印矩阵 -### 实现一个能找到栈的最小元素的函数 +### 两个链表的第一个公共节点 + +`长的链表先走k步` -`最小元素用辅助栈保存` ``` -int min(Stack *stack) +LinkListNode *common_node(LinkList *head1,LinkList head2); ``` -### 栈的压入,弹出序列 -输入2个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。比如: +### 在O(1)时间删除链表节点 -1,2,3,4,5是压栈序列,4,5,3,2,1是弹栈序列,但是4,3,5,1,2就不是弹栈序列 +已经有一个头节点指针,还有一个指向改删除节点的指针 + +`用下一个节点的内容覆盖当前删除节点的内容,删除下一个节点` ``` -bool is_pop_order(int *push,int *pop,int length) +void deleteNode(LinkList *head,LinkList *targetToDelete); ``` -### 从上往下打印二叉树 +### 输出链表中倒数第K个节点 -`辅助队列` +`使用两个指针,一个先走k-1步` ``` -void print_binary_level(BinaryTreeNode *root) +void print_lastK(LinkList *head); ``` -### 二叉搜索树的后续遍历序列 +### 反转链表 -输入一个整数数组,判断该数组是不是某二叉查找树的后续遍历序列的结果。比如【 5,7,6,9,11,10,8】 是下面二叉查找树的后续遍历结果: +`三个指针` ``` - 8 - / \ - / \ - 6 10 - / \ / \ - 5 7 9 11 +void reverse(LinkList *head); ``` -`寻找规律` -``` -bool is_post_order(BST *root,int *data, int length); -``` +反转二叉树呢? -### 二叉树中和为某一值的路径 - -``` - 10 - / \ - / \ - 5 12 - / \ - 5 7 -``` +### 合并2个排序的链表 -和为22的路径有2条:10--5--7, 10--12 +要求合并以后链表任然排序 -`递归,栈` +`递归` ``` -void print_path(BinaryTree *root,int n) +LinkList *merge(LinkList *one,LinkList *two); ``` + ### 复杂链表的复制 在复杂链表结构中,每个节点都有一个指向下一个节点的m_pNext;还有一个指向任意节点的m_pSibling @@ -291,26 +229,10 @@ typedef struct LinkListNode{ LinkList * copy(LinkList *head); ``` -### 二叉搜索树与双向链表 -将二叉搜索树转换成一个排序的双向链表,只调整树中节点的指针指向 - -`递归` `分解问题` - -``` -BST *transform(BST *root); -``` +# 列表&数列 -### 字符串的排列 - -输入一个字符串,打印该字符串中字符的所有排列 - -`递归,分解` - -``` -void print_full_permutation(char *string) -``` ### 数组中出现次数超过一半的数字 @@ -363,52 +285,85 @@ int one_appear_count(int n) int minSort(int *nums, int length); ``` -### 丑数 -> 只包含因子 2,3,5的数叫做丑数 +### 菲波那切数列 -求按从小到大的顺序,第1500个丑数 +> 波那切数列 fabonacci , 也叫黄金分割数列, F (0)=0, F (1)=1, F (n)= F (n - 1)+ F (n - 2) ; 即 0、1、1、2、3、5、8、13、21、34、…… ``` -int ugly(int n) +long long fabonacci(unsigned n) ``` -### 第一个只出现一次的字符 +### 调整数组顺序使奇数位于偶数前面 -在字符串中查找第一个只出现一次的字符 +调整后,所有奇数在前半部分,偶数在后半部分 + +`两边向中间扫描` -`哈希表:值为出现的次数` `二次扫描` ``` -char find_appear_once_char(char *string) +void reorder(int *data,int length) ``` -### 数组中的逆序对 ->数组中的两个数字如果前面一个数字大于后面的数字,这两个数字组成一个逆序对。如:[7,5,6,4] 的逆序对:(7,5)(7,6)(7,4)(5,4)(6,4) +### 旋转数组的最小数字 -输入一个数组,求出这个数组逆序对总数。 +旋转数组是指把一个数组最开始的若干个元素搬到数组的末尾。输入一个递增排序的数组的旋转,比如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转。求该数组的最小值。 -`归并排序 O(nlogn),空间O(n)` +``` +int min(int *num, int length) +``` + + + +### 数组中只出现一次的数字 + +数组中除了2个数字之外,其他的数组都出现了2次,找出这两个数 + +`异或` `二进制` + +>如果是只有1个数字只出现一次,我们可以通过对数组依次做异或运算。 + +如果我们能把原数组分成2个子数组,每个子数组都包含一个只出现一次的数字,问题就能解决了。我们把数组中的所有数字依次做异或操作,如果有2个数字不一样,结果肯定不是0,且异或结果数字的二进制表示中至少有一位是1(不然结果不就是0了) + +1. 在结果数字二进制表示中找到第一个为1的位的位置,标记n +2. 以二进制表示中第n位是不是1为标准,把原数组分成2个子数组 ``` -int reversePairs(int *data,int length) +void find_two_numbers_appear_once(int *data,int length,int *ouput) ``` -### 两个链表的第一个公共节点 +### 和为s的两个数字 VS 和为s的连续正数序列 -`长的链表先走k步` +有一个递增排序数组,和一个数字s,找出数组中的2个数,使得和等于s。输出任意一对即可 +`两边向中间扫描` ``` -LinkListNode *common_node(LinkList *head1,LinkList head2); +void print_two_numbers(int *data,int length,int sum) +``` + + + +### 数组中的逆序对 + +> 数组中的两个数字如果前面一个数字大于后面的数字,这两个数字组成一个逆序对。如:[7,5,6,4] 的逆序对:(7,5)(7,6)(7,4)(5,4)(6,4) + +输入一个数组,求出这个数组逆序对总数。 + +`归并排序 O(nlogn),空间O(n)` + + +``` +int reversePairs(int *data,int length) ``` + ### 数字在排序数组中出现的次数 比如 {1,2,3,3,3,3,4,5}, 数字 3出现了4次 @@ -420,131 +375,231 @@ int appear_count(int *nums,int length,int n); ``` -### 二叉树的深度 -`递归` +### n个色子的点数 + +把n个色子丢地上,朝上一面的点数之和为s。输入n,打印可能的值出现的概率 ``` -int tree_depth(BTree *root); +void print_sum_probability(int n) ``` -### 数组中只出现一次的数字 -数组中除了2个数字之外,其他的数组都出现了2次,找出这两个数 +### 扑克牌中的顺子 -`异或` `二进制` +从扑克牌从随机抽5张牌,判断是不是顺子。A是1,J~K是11~13,大小王可以看出任意数字。 ->如果是只有1个数字只出现一次,我们可以通过对数组依次做异或运算。 -如果我们能把原数组分成2个子数组,每个子数组都包含一个只出现一次的数字,问题就能解决了。我们把数组中的所有数字依次做异或操作,如果有2个数字不一样,结果肯定不是0,且异或结果数字的二进制表示中至少有一位是1(不然结果不就是0了) +``` +bool is_straight(int *data,int length) +``` -1. 在结果数字二进制表示中找到第一个为1的位的位置,标记n -2. 以二进制表示中第n位是不是1为标准,把原数组分成2个子数组 +### 圆圈中最后剩下的数字(约瑟夫问题) + +> 约瑟夫问题: 又称为约瑟夫环, N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3 + +0,1,...,n-1 这n个数字排成一个圆圈,从数字0开始从这个圆圈里面删除第m个数字,求出这个圆圈里最后剩下的数字。 ``` -void find_two_numbers_appear_once(int *data,int length,int *ouput) +int last_remaining(unsigned int n,unsigned int m) ``` -### 和为s的两个数字 VS 和为s的连续正数序列 +# 栈 & 队列 -有一个递增排序数组,和一个数字s,找出数组中的2个数,使得和等于s。输出任意一对即可 -`两边向中间扫描` +### 用两个栈实现队列 + +队列就是在尾部插入节点,头部删除节点。 + +### 实现一个能找到栈的最小元素的函数 + +`最小元素用辅助栈保存` + ``` -void print_two_numbers(int *data,int length,int sum) +int min(Stack *stack) ``` -### 反转单词顺序 VS 左旋转字符串 -a. 翻转句子中单词的顺序,但单词内字符不变。如 『I am a student』 -> 『student. a am I』 +### 栈的压入,弹出序列 -`先以单词为单位翻转,整个句子再次翻转` +输入2个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。比如: +1,2,3,4,5是压栈序列,4,5,3,2,1是弹栈序列,但是4,3,5,1,2就不是弹栈序列 ``` -char *reverse_by_word(char *string) +bool is_pop_order(int *push,int *pop,int length) ``` -b. 左旋转字符串是把字符串其那面的若干位转义到字符串的尾部。比如"abcedfsz"和数字2,结果是"cedfszab" + + + +# 矩阵 + +> 矩阵用二维数组表示 + + + +### 从外向里顺时针打印矩阵 ``` -char *left_rotate_string(char *s,int n) +void print_matrix_clockwise(int *matrix,int cols,int rows); ``` +延伸:按大小顺序打印矩阵 + -### n个色子的点数 -把n个色子丢地上,朝上一面的点数之和为s。输入n,打印可能的值出现的概率 +### 二维数组中的查找 + +二维数组中每一行从左到右递增,每一列从上到下递增,判断数组中是否包含该整数。 ``` -void print_sum_probability(int n) +bool find(int *matrix,int rows,int columns,int numbers) ``` -### 扑克牌中的顺子 -从扑克牌从随机抽5张牌,判断是不是顺子。A是1,J~K是11~13,大小王可以看出任意数字。 +# 二叉树 + + + +### 重建二叉树 + +输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树 ``` -bool is_straight(int *data,int length) +BinaryTree *construct(int *preorder,int inroder,int length); ``` -### 圆圈中最后剩下的数字(约瑟夫问题) -0,1,...,n-1 这n个数字排成一个圆圈,从数字0开始从这个圆圈里面删除第m个数字,求出这个圆圈里最后剩下的数字。 +### 树的子结构 +考察二叉树的基本操作。输入2课二叉树A和B,判断B是不是A的子结构。 ``` -int last_remaining(unsigned int n,unsigned int m) +struct BinaryTreeNode{ + int m_value; + BinaryTreeNode *m_pleft; + BinaryTreeNode *m_pRight; +} ``` -### 求 1+2+...+n -要求不用乘除法,for/while/if/else/switch等关键字及条件判断语句 +``` + 8 + / \ 10 + / \ / \ + 6 10 子结构 11 9 + / \ / \ + 5 7 9 11 +``` + +``` +bool subTree(BinaryTreeNode *root1,BinaryTreeNode *root2); +``` + +### 二叉树翻转 + ``` -long long sum(unsigned int n); + 8 8 + / \ / \ + / \ / \ + 6 10 翻转后 10 6 + / \ / \ / \ / \ + 5 7 9 11 11 9 7 5 +``` + +`交换每个节点的左右子树` + +``` +void reverse(BinaryTreeNode *root); ``` -### 不用加减乘除做加法 -求2个整数之和 -`位运算` +### 从上往下打印二叉树 +`辅助队列` ``` -int sum(int,int) +void print_binary_level(BinaryTreeNode *root) ``` -### 不能被继承的类 +### 二叉搜索树的后续遍历序列 + +输入一个整数数组,判断该数组是不是某二叉查找树的后续遍历序列的结果。比如【 5,7,6,9,11,10,8】 是下面二叉查找树的后续遍历结果: ``` + 8 + / \ + / \ + 6 10 + / \ / \ + 5 7 9 11 +``` + +`寻找规律` ``` +bool is_post_order(BST *root,int *data, int length); +``` -### 把字符串转换成整数 +### 二叉树中和为某一值的路径 -比如 "12343567754" -> 12343567754 +``` + 10 + / \ + / \ + 5 12 + / \ + 5 7 +``` + +和为22的路径有2条:10--5--7, 10--12 + +`递归,栈` + +``` +void print_path(BinaryTree *root,int n) +``` -`NULL,空串,正负号,溢出` +### 二叉搜索树与双向链表 + +将二叉搜索树转换成一个排序的双向链表,只调整树中节点的指针指向 + +`递归` `分解问题` + ``` -int strToInt(char str); +BST *transform(BST *root); ``` + + +### 二叉树的深度 + +`递归` + + +``` +int tree_depth(BTree *root); +``` + + + ### 树中2个结点的最低公共祖先 如果这个树是二叉排序树 @@ -553,7 +608,19 @@ int strToInt(char str); +# 其他 + + +### 不能被继承的类 + +``` + +``` +### 实现Singleton模式 + + +### 赋值运算符函数 From 3deb75f3f10180cc91106d7ea488aa0c2e500364 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 8 Sep 2021 14:00:57 +0800 Subject: [PATCH 088/151] update --- .../2 \351\223\276\350\241\250.md" | 21 +++++++++++++-- ...60\345\200\274\351\227\256\351\242\230.md" | 7 +++-- .../\345\211\221\346\214\207offer/README.md" | 26 +++++++++---------- .../README.md" | 12 ++++----- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 0aebc1a..d4d16a1 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -8,6 +8,12 @@ * 2个链表相交 * 2个链表合并 +常用解题思路 + +* 双指针 +* 3指针 +* 快慢指针 + ## 判断俩个链表是否相交 @@ -60,8 +66,18 @@ Node * sort_link_list_increasing_order (Node *pheader): ## 给定单链表,检测是否有环。 - -使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 + + +``` +int isLinkCicle(Link *head); +``` + +解题思路 + +1. 暴力 +2. 空间换时间,用一个HashMap +3. 快慢指针: 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 + 类似的题有: @@ -82,6 +98,7 @@ p->next=NULL。此时,原单链表可以看作两条单链表,一条从head 于是运用题二的方法,我们找到它们的第一个交点即为所求。 + ## 删除链表中的p节点 只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index e190fc8..b91be5c 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -15,10 +15,10 @@ 分析: 1. 不能使用循环,那就用递归 -2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句 +2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句) ``` -int (n){ +int sum(n){ int sum=0; (n>0) && sum=n+factorial(n-1) return sum; @@ -28,6 +28,9 @@ int (n){ ## 大数阶乘(factorial) +> 阶乘 n*(n-1)*(n-2)*...*1 + +主要考虑算出来的结果肯定会大于int表达的范围,这时候怎么处理? ``` int factorial(n){ diff --git "a/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" index 9f556e3..f4920c6 100644 --- "a/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" +++ "b/9 Algorithms Job Interview/\345\211\221\346\214\207offer/README.md" @@ -56,7 +56,7 @@ long long sum(unsigned int n); ``` -int sum(int,int) +int sum(int a,int b ``` @@ -72,37 +72,35 @@ int ugly(int n) -### 把字符串转换成整数 - -比如 "12343567754" -> 12343567754 +# 字符串 -`NULL,空串,正负号,溢出` -``` -int strToInt(char str); -``` +### 替换空格 +如把字符串中的每个空格替换成`%20` +`二遍扫描` +``` +void replace_blank(char *str); +``` -# 字符串 +### 把字符串转换成整数 +比如 "12343567754" -> 12343567754 -### 替换空格 -如把字符串中的每个空格替换成`%20` +`NULL,空串,正负号,溢出` -`二遍扫描` ``` -void replace_blank(char *str); +int strToInt(char str); ``` - ### 第一个只出现一次的字符 在字符串中查找第一个只出现一次的字符 diff --git "a/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" "b/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" index 902db80..644f8a3 100644 --- "a/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" +++ "b/9 Algorithms Job Interview/\347\274\226\347\250\213\344\271\213\347\276\216/README.md" @@ -8,17 +8,18 @@ 4. 数学之趣: 一些数学问题 《剑指offer》中已经出现的题目先不写了 + +# 游戏之乐 -### 游戏之乐 -#### -### 数字之魅 +# 数字之魅 #### 二进制数中1的个数 + #### 阶乘 @@ -74,7 +75,7 @@ -### 结构之法 +# 结构之法 #### 字符串移位包含的问题 @@ -110,8 +111,7 @@ - -### 数学之趣 +# 数学之趣 #### From dee987d94a7ada30c92960b60467c41aa05577f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Thu, 9 Sep 2021 00:21:07 +0800 Subject: [PATCH 089/151] update string --- ...1 \345\255\227\347\254\246\344\270\262.md" | 477 +----------------- ...6\344\270\262-\346\237\245\346\211\276.md" | 188 +++++++ ...6\344\270\262-\345\210\240\351\231\244.md" | 71 +++ ...6\344\270\262-\344\277\256\346\224\271.md" | 230 +++++++++ 4 files changed, 496 insertions(+), 470 deletions(-) create mode 100644 "9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" create mode 100644 "9 Algorithms Job Interview/1.2 \345\255\227\347\254\246\344\270\262-\345\210\240\351\231\244.md" create mode 100644 "9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index 5cd0f41..d5cb9a0 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -2,106 +2,13 @@ 字符串常见的问题: -* 单词反转/移动/回文判断 +* 回文判断 * 字符(串)统计 * 字符串的压缩 -* 字符串的排列和组合 -* 字符串比较 -* 子串 - - -## 翻转句子中单词的顺序 - -题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 -例如输入“I am a student.”,则输出“student. a am I”。 - -``` -char *revert_by_word(char *source); -``` - -思路: - -* 原地逆序,字符串2边的字符逐个交换 , 再按单词逆序; -* 也可以先按单词逆序,再对整个句子逆序; - -针对不允许临时空间的情况,也就是字符交换不用临时空间,可以使用的方法有: - -1. 异或操作 -2. 也就是2个整数相互交换一个道理 - -``` -char a = 'a', b = 'b'; -a = a + b; -b = a - b; -a = a - b; -``` - -最终示例代码: - -``` -//反转 -void _reverse(char *start,char *end){ - if ((start == NULL) || (end == NULL)) return; - while(start < end){ - char tmp = *start; - *start = *end; - *end = tmp; - - start++, - end--; - } -} - -char *revert_by_word(char *source){ - char *end = source; - char *start = source; - if (source == NULL) return NULL; - - //end指针挪动到尾部 - while (*end != '\0') end++; - end--; - - //先全部反转 - _reverse(start,end); - - //按单词反转 - start=end=source; - while(*start != '\0'){ - if (*start == ' '){ - start++; - end++; - }else if(*end == ' ' || *end == '\0'){ - _reverse(start,end-1); - start = end; - }else{ - end++; - } - } - return source; -} -``` - -类似的题目还有: - -不开辟用于交换数据的临时空间,如何完成字符串的逆序 -用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 - - -## 左旋转字符串 - ->字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 - -如把`字符串abcdef`左旋转2位得到`字符串cdefab` 。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 - -``` -char *left_rotate(char *str,int offset){ - -} -``` - -思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了。 -也就是跟上面的问题是同样的问题。 - +* 字符串的排列和组合 +* [子串查找](1.1%20字符串-查找.md) +* [字符删除](1.2%20字符串-删除.md) +* [字符串修改](1.3%20字符串-修改.md) 如单词反转/移动/ ## 判断字符串是否是回文 @@ -137,44 +44,6 @@ int is_huiwen(const char *source){ ``` -## 找到第一个只出现一次的字符 - -在一个字符串中找到第一个只出现一次的字符。如输入ahbaccdeff,则输出h。 - -``` -char char_first_appear_once(const char *source) -``` - -思路一: 蛮力统计, O(n^2)复杂度 -思路二: 使用hash表,2次扫描,第一次建立hash表 key为字符,value为出现次数;第二次扫描找到第一个value为1的key,时间复杂度O(n) - -hash表长度 256,字符直接作为key值。需要注意的是 char 的范围是 -128~127,unsigned char 才是0~255 - - -示例代码: - -``` -char char_first_appear_once(const unsigned char *source){ - int hash[256]={0}; - char *tmp = source; - if (tmp == NULL) return '\0'; - while(*tmp != '\0'){ - hash[*tmp]++; - tmp++; - } - - tmp = source; - while(*tmp != '\0'){ - if (hash[*tmp] == 1) return *tmp; - tmp++; - } - return '\0'; -} -``` - - -题目扩展:这里的字符换成整数,整数数量几十TB,海量数据处理,显然hash方法不可能,没有那么大得内容 - ## 统计文章里单词出现的次数 @@ -191,93 +60,6 @@ void statistics(FILE *fd) 如果是海量数据里面统计top-k次数的单词呢? -## 替换空格 - -实现一个函数,把每个空格替换成 "%20",如输入“we are happy”,则输出“we%20are%20happy” - -``` -char *replce_blank(char *source) -``` - -主要问题是一个字符替换成3个字符,替换后的字符串比原串长。 -如果想要在原串上直接修改,就不能顺序替换。且原串的空间应该足够大,能容纳替换变长以后的字符串。如果空间不够,就要新建一块空间来保存替换的结果了。这里假设空间足够 - -1. 第一遍扫描,统计空格个数 n, 替换后的字符串长度 = 原长度+2*n -2. 从后向前扫描字符串,挪动每个字符的位置。注意碰到空格的地方 - - -``` -char *replace_blank(char *source){ - int count = 0; - char *tail = source; - if (source == NULL) return NULL; - while(*tail != '\0'){ - if (*tail == ' ') count++; - tail++; - } - - while(count){ - if(*tail != ' '){ - *(tail+2*count) = *tail; - }else{ - *(tail+2*count) = '0'; - *(tail+2*count-1) = '2'; - *(tail+2*count-2) = '%'; - count--; - } - tail--; - } - - return source; -} -``` - - -## 小写字母排在大写字母的前面 - -有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型: - -``` -void proc(char *str) -``` -分析: - -比如:HaJKPnobAACPc,要小写字母前面且不要求保存顺序,可以是:anobcHJKPAACP - -1. 小写字母 a~z 的 ASCII码值是 97~122,A~Z的 ASCII码值是 65~90;0~9 的ASCII码是 48~57 -2. 两边向中间扫描,左边大写右边小写就交换;如果都小写,头指针向前知道找到大写;如果都是大写,尾指针向后找小写; - - -示例代码 - -``` -char *proc(char *str){ - char *start = str; - char *end = str; - if (str == NULL) return NULL; - while(*end != '\0') end++; - end--; - - while(start < end){ - if (*start >= 'A' && *start <= 'Z'){//大写 - if (*end >= 'a' && *end <= 'z'){ - char tmp = *start; - *start = *end; - *end = tmp; - - start++; - } - end--; - }else{//小写 - if (*end >= 'A' && *end <= 'Z'){ - end--; - } - start++; - } - } - return str; -} -``` ## 实现字符串转整型的函数 @@ -305,246 +87,12 @@ int atoi(const char *str){ 详细过程也可以[参考这里](http://blog.csdn.net/v_july_v/article/details/9024123) -## 删除串中指定的字符 - -删除指定的字符以后,后面的字符都要向前移动一位。这种复杂度是O(N^2);那么有没有O(N)的方法呢? - -比如 "abcdeccba" 删除字符 "c"。使用2个指针,一前一后,比较前面的指针和删除字符: - -1. 不相等,两个指针一起跑,且前面的指针值拷贝到后面指针指向的空间 -2. 相等时,快指针向前一步 - -``` -char *delete_occurence_character(char *src , char target){ - char *front = src; - char *rear = src; - while(*front != '\0'){ - if (*front != target){ - *rear = *front; - rear++; - } - front++; - } - *rear = '\0'; - return src; -} -``` - - -## 在字符串中删除特定的字符 - -题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。 - -这是上个题目的升级版本。 - -``` -char *delete_occurence_characterset(char *source,const char *del); -``` - -1. 蛮力法。 遍历字符串,每个字符去删除字符串集合中查找,有就删除 -2. 使用上面的方式,一次遍历 - - - -## 删除字符串中的数字并压缩字符串 - -如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N)) -这道题跟上一道题也是一个意思。 - - -示例代码: - -``` -char *trim_number(char *source){ - char *start = source; - char *end = source; - if (source == NULL) return NULL; - while(*end != '\0'){ - if (*end < '0' || *end > '9' ){ - *start = *end; - start++; - } - end++; - } - *start = '\0'; - return source; -} -``` - - - - -## 字符串中找出连续最长的数字串 - -写一个函数,功能: - -在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串赋值给其中一个函数参数outputstr所指内存。 - -例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789 - -它的原形是: - -``` -int longest_continuious_number(const char *input,char *output) -``` - -应该有3个指针,第一个指针指向一个当前最长数字串的第一个数字,第二个指针指向第二个数字串的第一个数字,第三个指针是遍历指针,且统计第二个数字串的长度;当统计出来的长度大于第一个数字串的长度,第一个指针指向第二个指针指向的数字,相反,第二个指针和第三个指针继续向后查找。 - - -1. 当end首次碰到数字时,且tmp=0,说明是首次出现数字,第二个指针移到该数字,继续遍历 -2. 如果数字后面还是数字,tmp!=0 就是第二个数字串,因此 tmp += 1; -3. 当end从数字到普通字符时,如果tmp > max ,就要修改max和第一个指针start ,并把tmp归为0 - - -``` -int longest_continuious_number(const char *input,char *output){ - int max = 0; - char *start= input; - char *mid = input; - char *end = input; - int tmp = 0; - if (input == NULL || output == NULL) return 0; - - while (*end != '\0'){ - if (*end < '0' || *end < '9'){//字母 - if(tmp > max){ - max = tmp; - start = mid; - } - tmp = 0; - }else{//数字 - if (tmp == 0){//发现数字 - mid = end; - } - tmp++; - } - end++; - } - - //修改已数字结尾的bug - if(tmp > max){ - max = tmp; - start = mid; - } - - //copy - int i=0; - while(i strstr(str1,str2) 判断str2是否是str1的子串。 - -``` -/* -@ret 有就返回第一次出现子串的地址,否则返回NULL -*/ -char *strstr(const char *source, const char *target){ - -} -``` ## 匹配兄弟字符串 +什么是兄弟字符串? + 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。 思路:判断各自素数乘积是否相等。更多方法请参见:http://blog.csdn.net/v_JULY_v/article/details/6347454。 @@ -592,17 +140,6 @@ int isBrother(const char *first,const char *secd){ 给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。 - - - -## 编写strcpy 函数 - -已知strcpy 函数的原型是: -``` -char *strcpy(char *strDest, const char *strSrc); -``` -其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数 - diff --git "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" new file mode 100644 index 0000000..e9eb47d --- /dev/null +++ "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" @@ -0,0 +1,188 @@ +#字符串-查找 + +* 子串查找 + + + +## 找到第一个只出现一次的字符 + +在一个字符串中找到第一个只出现一次的字符。如输入ahbaccdeff,则输出h。 + +``` +char char_first_appear_once(const char *source) +``` + +思路一: 蛮力统计, O(n^2)复杂度 +思路二: 使用hash表,2次扫描,第一次建立hash表 key为字符,value为出现次数;第二次扫描找到第一个value为1的key,时间复杂度O(n) + +hash表长度 256,字符直接作为key值。需要注意的是 char 的范围是 -128~127,unsigned char 才是0~255 + + +示例代码: + +``` +char char_first_appear_once(const unsigned char *source){ + int hash[256]={0}; + char *tmp = source; + if (tmp == NULL) return '\0'; + while(*tmp != '\0'){ + hash[*tmp]++; + tmp++; + } + + tmp = source; + while(*tmp != '\0'){ + if (hash[*tmp] == 1) return *tmp; + tmp++; + } + return '\0'; +} +``` + + +题目扩展:这里的字符换成整数,整数数量几十TB,海量数据处理,显然hash方法不可能,没有那么大得内容 + + +## 请编写能直接实现strstr()函数功能的代码。 + +> strstr(str1,str2) 判断str2是否是str1的子串。 + +``` +/* +@ret 有就返回第一次出现子串的地址,否则返回NULL +*/ +char *strstr(const char *source, const char *target){ + +} +``` + + +### 字符串中找出连续最长的数字子串 + +写一个函数,功能: + +在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串赋值给其中一个函数参数outputstr所指内存。 + +例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789 + +它的原形是: + +``` +int longest_continuious_number(const char *input,char *output) +``` + +应该有3个指针,第一个指针指向一个当前最长数字串的第一个数字,第二个指针指向第二个数字串的第一个数字,第三个指针是遍历指针,且统计第二个数字串的长度;当统计出来的长度大于第一个数字串的长度,第一个指针指向第二个指针指向的数字,相反,第二个指针和第三个指针继续向后查找。 + + +1. 当end首次碰到数字时,且tmp=0,说明是首次出现数字,第二个指针移到该数字,继续遍历 +2. 如果数字后面还是数字,tmp!=0 就是第二个数字串,因此 tmp += 1; +3. 当end从数字到普通字符时,如果tmp > max ,就要修改max和第一个指针start ,并把tmp归为0 + + +``` +int longest_continuious_number(const char *input,char *output){ + int max = 0; + char *start= input; + char *mid = input; + char *end = input; + int tmp = 0; + if (input == NULL || output == NULL) return 0; + + while (*end != '\0'){ + if (*end < '0' || *end < '9'){//字母 + if(tmp > max){ + max = tmp; + start = mid; + } + tmp = 0; + }else{//数字 + if (tmp == 0){//发现数字 + mid = end; + } + tmp++; + } + end++; + } + + //修改已数字结尾的bug + if(tmp > max){ + max = tmp; + start = mid; + } + + //copy + int i=0; + while(i '9' ){ + *start = *end; + start++; + } + end++; + } + *start = '\0'; + return source; +} +``` + + diff --git "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" new file mode 100644 index 0000000..40ccc9e --- /dev/null +++ "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" @@ -0,0 +1,230 @@ +# 字符串-修改 + + + + + +## 翻转句子中单词的顺序 + +题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 +例如输入“I am a student.”,则输出“student. a am I”。 + +``` +char *revert_by_word(char *source); +``` + +思路: + +* 原地逆序,字符串2边的字符逐个交换 , 再按单词逆序; +* 也可以先按单词逆序,再对整个句子逆序; + +针对不允许临时空间的情况,也就是字符交换不用临时空间,可以使用的方法有: + +1. 异或操作 +2. 也就是2个整数相互交换一个道理 + +``` +char a = 'a', b = 'b'; +a = a + b; +b = a - b; +a = a - b; +``` + +最终示例代码: + +``` +//反转 +void _reverse(char *start,char *end){ + if ((start == NULL) || (end == NULL)) return; + while(start < end){ + char tmp = *start; + *start = *end; + *end = tmp; + + start++, + end--; + } +} + +char *revert_by_word(char *source){ + char *end = source; + char *start = source; + if (source == NULL) return NULL; + + //end指针挪动到尾部 + while (*end != '\0') end++; + end--; + + //先全部反转 + _reverse(start,end); + + //按单词反转 + start=end=source; + while(*start != '\0'){ + if (*start == ' '){ + start++; + end++; + }else if(*end == ' ' || *end == '\0'){ + _reverse(start,end-1); + start = end; + }else{ + end++; + } + } + return source; +} +``` + +类似的题目还有: + +不开辟用于交换数据的临时空间,如何完成字符串的逆序 +用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 + + +## 左旋转字符串 + +>字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 + +如把`字符串abcdef`左旋转2位得到`字符串cdefab` 。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 + +``` +char *left_rotate(char *str,int offset){ + +} +``` + +思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了。 +也就是跟上面的问题是同样的问题。 + + + +## 替换空格 + +实现一个函数,把每个空格替换成 "%20",如输入“we are happy”,则输出“we%20are%20happy” + +``` +char *replce_blank(char *source) +``` + +主要问题是一个字符替换成3个字符,替换后的字符串比原串长。 +如果想要在原串上直接修改,就不能顺序替换。且原串的空间应该足够大,能容纳替换变长以后的字符串。如果空间不够,就要新建一块空间来保存替换的结果了。这里假设空间足够 + +1. 第一遍扫描,统计空格个数 n, 替换后的字符串长度 = 原长度+2*n +2. 从后向前扫描字符串,挪动每个字符的位置。注意碰到空格的地方 + + +``` +char *replace_blank(char *source){ + int count = 0; + char *tail = source; + if (source == NULL) return NULL; + while(*tail != '\0'){ + if (*tail == ' ') count++; + tail++; + } + + while(count){ + if(*tail != ' '){ + *(tail+2*count) = *tail; + }else{ + *(tail+2*count) = '0'; + *(tail+2*count-1) = '2'; + *(tail+2*count-2) = '%'; + count--; + } + tail--; + } + + return source; +} +``` + + + + +## 小写字母排在大写字母的前面 + +有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型: + +``` +void proc(char *str) +``` +分析: + +比如:HaJKPnobAACPc,要小写字母前面且不要求保存顺序,可以是:anobcHJKPAACP + +1. 小写字母 a~z 的 ASCII码值是 97~122,A~Z的 ASCII码值是 65~90;0~9 的ASCII码是 48~57 +2. 两边向中间扫描,左边大写右边小写就交换;如果都小写,头指针向前知道找到大写;如果都是大写,尾指针向后找小写; + + +示例代码 + +``` +char *proc(char *str){ + char *start = str; + char *end = str; + if (str == NULL) return NULL; + while(*end != '\0') end++; + end--; + + while(start < end){ + if (*start >= 'A' && *start <= 'Z'){//大写 + if (*end >= 'a' && *end <= 'z'){ + char tmp = *start; + *start = *end; + *end = tmp; + + start++; + } + end--; + }else{//小写 + if (*end >= 'A' && *end <= 'Z'){ + end--; + } + start++; + } + } + return str; +} +``` + + + + + +## 字符串原地压缩 + +题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 + +这道题需要注意: +1. 单个字符不压缩 +2. 注意考虑压缩后某个字符个数是多位数(超过10个) +3. 原地压缩最麻烦的地方就是数据移动 + + +这是使用2个指针,一前一后,如果不相等,都往前移动一位;如果相等,后一位变为数字2,且移动后面的指针一位,任然相等则数字加1,不相等 + + +``` +char *compress(const char *src,char *dest){ + +} +``` + +上面的压缩算法可以看到,压缩算法的`效率`验证依赖`给定字符串的特性`,如果'aaaaaaaa....aaa' 这样特征的字符串,使用上面的压缩算法,压缩率接近100%,相反,可能会的0%的压缩率。 + + + + + +## 编写strcpy 函数 + +已知strcpy 函数的原型是: +``` +char *strcpy(char *strDest, const char *strSrc); +``` +其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数 + + + + From c21f1fe0a2fc14b835bae8fd90b5014cba1c1ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Thu, 9 Sep 2021 00:37:03 +0800 Subject: [PATCH 090/151] update string --- .../1 \345\255\227\347\254\246\344\270\262.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index d5cb9a0..1f67dc4 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -8,7 +8,7 @@ * 字符串的排列和组合 * [子串查找](1.1%20字符串-查找.md) * [字符删除](1.2%20字符串-删除.md) -* [字符串修改](1.3%20字符串-修改.md) 如单词反转/移动/ +* [字符串修改](1.3%20字符串-修改.md) 如单词反转/移动等 ## 判断字符串是否是回文 From 7f2eace61c5871419a1ccef14fd97372d6e2e854 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 9 Sep 2021 13:48:07 +0800 Subject: [PATCH 091/151] update linklist & numerical --- .../2 \351\223\276\350\241\250.md" | 169 +----------- ...6\350\241\250-\346\216\222\345\272\217.md" | 62 +++++ ...6\350\241\250-\345\210\240\351\231\244.md" | 62 +++++ ...\351\223\276\350\241\250-2\346\235\241.md" | 41 +++ ...60\345\200\274\351\227\256\351\242\230.md" | 256 +----------------- ...40\345\207\217\344\271\230\351\231\244.md" | 93 +++++++ ...0\345\200\274-\346\214\207\346\225\260.md" | 103 +++++++ ...4-\351\232\217\346\234\272\346\225\260.md" | 21 ++ ...17\345\205\254\345\200\215\346\225\260.md" | 25 ++ ...60\345\210\227\351\227\256\351\242\230.md" | 11 + .../97 \345\205\266\344\273\226.md" | 40 +++ 11 files changed, 487 insertions(+), 396 deletions(-) create mode 100644 "9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" create mode 100644 "9 Algorithms Job Interview/2.2 \351\223\276\350\241\250-\345\210\240\351\231\244.md" create mode 100644 "9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" create mode 100644 "9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" create mode 100644 "9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" create mode 100644 "9 Algorithms Job Interview/4.3 \346\225\260\345\200\274-\351\232\217\346\234\272\346\225\260.md" create mode 100644 "9 Algorithms Job Interview/4.4 \346\225\260\345\200\274-\346\234\200\345\260\217\345\205\254\345\200\215\346\225\260.md" create mode 100644 "9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index d4d16a1..407d3b4 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -2,11 +2,14 @@ 链表常常碰到的问题有: + +* [链表排序](2.1%20链表-排序.md) +* [链表删除](2.2%20链表-删除.md) : 如删除链表中的p节点,在p节点前面插入节点q, 要求O(1)复杂度 +* [2个链表](2.3%20链表-2条.md) 相交,合并 * 链表反转 * 链表中是否有环 -* 删除链表中的p节点,在p节点前面插入节点q, 要求O(1)复杂度 -* 2个链表相交 -* 2个链表合并 + + 常用解题思路 @@ -15,22 +18,6 @@ * 快慢指针 -## 判断俩个链表是否相交 - -给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。 - -问题扩展: - -1.如果链表可能有环列? -2.如果需要求出俩个链表相交的第一个节点列? - - -## 输出两个非降序链表的并集 - -请修改append函数,利用这个函数实现: - -两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5 。另外只能输出结果,不能修改两个链表的数据。 - ## 输出链表中倒数第k个结点 @@ -44,115 +31,12 @@ struct ListNode }; -## 链表排序 - -Given a head pointer pointing to a linked list ,please write a function that sort the list -in increasing order. You are not allowed to use temporary array or memory copy (微软面试题) - -``` -struct -{ - int data; - struct S_Node *next; -}Node; - -Node * sort_link_list_increasing_order (Node *pheader): -``` - -## 单链表归并排序 - -啥是归并排序? - - - -## 给定单链表,检测是否有环。 - - -``` -int isLinkCicle(Link *head); -``` - -解题思路 - -1. 暴力 -2. 空间换时间,用一个HashMap -3. 快慢指针: 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 - - - -类似的题有: - -1 给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。 - - 如果head1==head2,那么显然相交,直接返回head1。 - 否则,分别从head1,head2开始遍历两个链表获得其长度len1与len2,假设len1>=len2, -那么指针p1由head1开始向后移动len1-len2步,指针p2=head2, -下面p1、p2每次向后前进一步并比较p1p2是否相等,如果相等即返回该结点, -否则说明两个链表没有交点。 - - -2 给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点。 - - 运用题一,我们可以检查链表中是否有环。如果有环,那么p1p2重合点p必然在环中。从p点断开环,方法为:p1=p, p2=p->next, -p->next=NULL。此时,原单链表可以看作两条单链表,一条从head开始,另一条从p2开始, -于是运用题二的方法,我们找到它们的第一个交点即为所求。 - - - -## 删除链表中的p节点 - -只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。 - -办法很简单,首先是放p中数据,然后将p->next的数据copy入p中,接下来删除p->next即可。 - - -类似的还有问题:只给定单链表中某个结点p(非空结点),在p前面插入一个结点。办法类似,首先分配一个结点q,将q插入在p后, -接下来将p中的数据copy入q中,然后再将要插入的数据记录在p中。都可以做到0(1)复杂度 - - ## 链表反转 三个指针,遍历一遍(0(n)复杂度 -## 复杂链表的复制 - -题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: -``` -struct ComplexNode -{ - int m_nValue; - ComplexNode* m_pNext; - ComplexNode* m_pSibling; -}; -``` - -下图是一个含有5个结点的该类型复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,指向NULL的指针没有画出。 -请完成函数`ComplexNode* Clone(ComplexNode* pHead)`,以复制一个复杂链表。 - - - -## 找出两个链表的第一个公共结点 - -题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为: -``` -struct ListNode -{ - int m_nKey; - ListNode* m_pNext; -}; -``` - -分析:第一个公共节点,也就是2个链表中的节点的m_pNext 指向的同一个节点。 - -1. 先遍历2个链表,得到各自的长度,和差sub -2. 长链表先遍历sub个节点,然后2个节点一起遍历 -3. 第一次同时指向的同一个节点就是这个commonNode - - - - ## 从尾到头输出链表 输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下: @@ -169,46 +53,23 @@ struct ListNode{ 思路三: 递归实现,将printf语句放在递归调用后面。果然妙极。。 -## 在O(1)时间内删除链表结点 -题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: -``` -struct ListNode{ - int m_nKey; - ListNode* m_pNext; -}; - -//函数的声明如下: -void deleteNode(ListNode* pListHead, ListNode* pToBeDeleted); - -``` - -思路: -保存下一个节点的值tmp,删除下一个节点,当前节点=tmp - - -## 将两链表中data值相同的结点删除 - - -有双向循环链表结点定义为: +## 复杂链表的复制 +题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: ``` -struct node{ - int data; - struct node *front,*next; +struct ComplexNode +{ + int m_nValue; + ComplexNode* m_pNext; + ComplexNode* m_pSibling; }; - ``` -有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。 - - - - - - +下图是一个含有5个结点的该类型复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,指向NULL的指针没有画出。 +请完成函数`ComplexNode* Clone(ComplexNode* pHead)`,以复制一个复杂链表。 diff --git "a/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" "b/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" new file mode 100644 index 0000000..f0f4288 --- /dev/null +++ "b/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" @@ -0,0 +1,62 @@ +# 链表-排序 + + + + +## 链表排序 + +Given a head pointer pointing to a linked list ,please write a function that sort the list +in increasing order. You are not allowed to use temporary array or memory copy (微软面试题) + +``` +struct +{ + int data; + struct S_Node *next; +}Node; + +Node * sort_link_list_increasing_order (Node *pheader): +``` + + +## 单链表归并排序 + +啥是归并排序? + + + +## 给定单链表,检测是否有环。 + +``` +int isLinkCicle(Link *head); +``` + +解题思路 + +1. 暴力 +2. 空间换时间,用一个HashMap +3. 快慢指针: 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 + + + +类似的题有: + +1 给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。 + + 如果head1==head2,那么显然相交,直接返回head1。 + 否则,分别从head1,head2开始遍历两个链表获得其长度len1与len2,假设len1>=len2, +那么指针p1由head1开始向后移动len1-len2步,指针p2=head2, +下面p1、p2每次向后前进一步并比较p1p2是否相等,如果相等即返回该结点, +否则说明两个链表没有交点。 + + +2 给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点。 + + 运用题一,我们可以检查链表中是否有环。如果有环,那么p1p2重合点p必然在环中。从p点断开环,方法为:p1=p, p2=p->next, +p->next=NULL。此时,原单链表可以看作两条单链表,一条从head开始,另一条从p2开始, +于是运用题二的方法,我们找到它们的第一个交点即为所求。 + + + + + diff --git "a/9 Algorithms Job Interview/2.2 \351\223\276\350\241\250-\345\210\240\351\231\244.md" "b/9 Algorithms Job Interview/2.2 \351\223\276\350\241\250-\345\210\240\351\231\244.md" new file mode 100644 index 0000000..082149b --- /dev/null +++ "b/9 Algorithms Job Interview/2.2 \351\223\276\350\241\250-\345\210\240\351\231\244.md" @@ -0,0 +1,62 @@ +#链表-删除 + + + +## 在O(1)时间内删除链表结点 + +题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下: + +``` +struct ListNode{ + int m_nKey; + ListNode* m_pNext; +}; + +//函数的声明如下: +void deleteNode(ListNode* pListHead, ListNode* pToBeDeleted); + +``` + +思路: +保存下一个节点的值tmp,删除下一个节点,当前节点=tmp + + + + +## 删除链表中的p节点 + +只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。 + +办法很简单,首先是放p中数据,然后将p->next的数据copy入p中,接下来删除p->next即可。 + + +类似的还有问题:只给定单链表中某个结点p(非空结点),在p前面插入一个结点。办法类似,首先分配一个结点q,将q插入在p后, +接下来将p中的数据copy入q中,然后再将要插入的数据记录在p中。都可以做到0(1)复杂度 + + + + +## 将两链表中data值相同的结点删除 + + +有双向循环链表结点定义为: + + +``` +struct node{ + int data; + struct node *front,*next; +}; + +``` + +有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。 + + + + + + + + + diff --git "a/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" "b/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" new file mode 100644 index 0000000..b80c6a6 --- /dev/null +++ "b/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" @@ -0,0 +1,41 @@ +# 链表-2条 + + +## 找出两个链表的第一个公共结点 + +题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为: +``` +struct ListNode +{ + int m_nKey; + ListNode* m_pNext; +}; +``` + +分析:第一个公共节点,也就是2个链表中的节点的m_pNext 指向的同一个节点。 + +1. 先遍历2个链表,得到各自的长度,和差sub +2. 长链表先遍历sub个节点,然后2个节点一起遍历 +3. 第一次同时指向的同一个节点就是这个commonNode + + + + +## 判断俩个链表是否相交 + +给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。 + +问题扩展: + +1.如果链表可能有环列? +2.如果需要求出俩个链表相交的第一个节点列? + + + +## 输出两个非降序链表的并集 + +请修改append函数,利用这个函数实现: + +两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5 。另外只能输出结果,不能修改两个链表的数据。 + + diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index b91be5c..60bedec 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -2,44 +2,26 @@ 这部分都是一些数学几何计算方面的问题。主要由: -* 位运算 +* [加减乘除](4.1%20数值-加减乘除.md) +* 指数(乘方) * 随机数 +* 进制转换:位运算 * 大数问题 -## 求1+2+…+n - -要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 +## ipv4 转 int -思路:这是等差数列求和公式, 1+2+3.......+N =(n+1)n/2 +比如: 127.0.0.1 , 转为int 为 (01111111 00000000 00000000 00000001) -分析: -1. 不能使用循环,那就用递归 -2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句) +思路: ``` -int sum(n){ - int sum=0; - (n>0) && sum=n+factorial(n-1) - return sum; -} -``` - - -## 大数阶乘(factorial) - -> 阶乘 n*(n-1)*(n-2)*...*1 - -主要考虑算出来的结果肯定会大于int表达的范围,这时候怎么处理? +int toInt(){ -``` -int factorial(n){ - int sum=0; - (n>0) && sum=n+factorial(n-1) - return sum; } ``` +那么,int 转 ipv4 如何解呢? @@ -68,19 +50,6 @@ int one_appear_count_by_binary(int num){ ``` -## 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 - -分析: -``` -#define min(a,b) ((a)>(b)?(a):(b)) -#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) -``` - -这里不能使用比较符号: - -``` -#define min(a,b) ((a)-(b) & (0x1<<31))?(a):(b) -``` ## 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列 @@ -97,160 +66,26 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; ``` -## ipv4 转 int - -比如: 127.0.0.1 , 转为int 为 (01111111 00000000 00000000 00000001) - -思路: - - - -``` -int toInt(){ - -} -``` - -那么,int 转 ipv4 如何解呢? - - - -## 判断一个自然数是否是某个数的平方 - -说明:当然不能使用开方运算。 - -``` -square(25) YES -square(35) NO -``` - -方法1: 从1开始遍历,显然这种方法很差 -方法2: 除数跟余数比较,除数从2开始,每一轮都跟结果比较;相等就是存在这个数,不相等就把除数++;时间复杂度为(根号n)。在一个数比较大时,效率不够好。如1194877489 =(34567)^2,需要从2开始,一直比较到34566,做3万多次除法和比较运算。跟方法1一样。。 - -方法3:二分查找 O(logn)。比如25: - -a. 先取(0+25)/2=12.5,12.5*12.5>25,因此这个数应该小于12.5 -b.(0+12)/2 = 6, 6*6>25 -c. (0+6)/2 = 3 -d. (3+6)/2 = 4.5 -e. (5+6)/2 = 5.5 - -``` -int is_powered(int num) -``` - -## 1024! 末尾有多少个0? +## 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 分析: -末尾0的个数取决于2和5的个数 -能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 - - - -## 编程实现两个正整数的除法(和取模) - -编程实现两个正整数的除法,当然不能用除法操作符。 -``` -int div(const int x, const int y) -``` - -1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 -2. 位运算 - - - - - -## 求两个或N个数的最大公约数和最小公倍数。 - - - -## 大整数乘法(或 大整数阶乘) - -请使用代码计算`1234567891011121314151617181920*2019181716151413121110987654321` 。 - -1. 注意结果可能超出长整形的最大范围 2^64-1 -2. 采用分治算法,将大整数相乘转换为小整数计算 - -规律分析:任意位数的整数相乘,最终都可以转化为2位数相乘 - - - -## 两个数相乘,小数点后位数没有限制,请写一个高精度算法 - - - -## 数值的整数次方 - -题目:实现函数`double Power(double base, int exponent)`,求base的exponent次方。 - -不需要考虑溢出。 - -分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码: -``` -double Power(double base, int exponent) -{ - double result = 1.0; - for(int i = 1; i <= exponent; ++i) - result *= base; - return result; -} -``` - - -上面的代码没有考虑: exponent<=0 -判断一个浮点数是不是等于0时,不是直接写 base == 0 ,而应该判断它们的差的绝对值是不是小于一个很小的范围 - -如果指数大于0,我们还可以使用递归实现:`a^n = a^(n/2)*a^(n/2)` (n为偶数), 通过这个思路也可以实现 ``` -2^16 = 2^8 * 2^8 -2^8 = 2^4 * 2^4 -2^4 = 2^2 * 2^2 -2^2 = 2^1 * 2^1 -2^1 = 2 -``` - -用例: - -``` -2 3 = 8 -0 3 = 0 -2 0 = 1 -2 -3 = 1/(2^3) = 0.125 -0 -3 +#define min(a,b) ((a)>(b)?(a):(b)) +#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) ``` -使用递归实现的代码示例: +这里不能使用比较符号: ``` -double Power(double base, unsigned int exponent) -{ - if (exponent == 0) return 1; - if (exponent == 1) return base; - double result = Power(base, exponent >> 1); - result *= result; - - if (exponent & 1) result = result*base; - - return reslut; -} +#define min(a,b) ((a)-(b) & (0x1<<31))?(a):(b) ``` -## 求根号2的值 - -并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 - -分析: -泰勒级数 -牛顿迭代法 - - ## 整数的素数和分解问题 -歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。 +> 歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。 对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。 对于一个给定的整数,输出所有这种素数和分解式。 @@ -266,69 +101,6 @@ double Power(double base, unsigned int exponent) ``` -## 大于K的最小正整数 - -给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 - -比如,A=[1,0] K=21 那么输出结构应该为100。 - - - -## 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。 - - - -## 设计一个随机算法 - -给你5个球,每个球被抽到的可能性为30、50、20、40、10,设计一个随机算法,该算法的输出结果为本次执行的结果。输出A,B,C,D,E即可。 - - -## 构造一个随机发生器 - -已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器, -使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;..., -构造一个发生器,使得它构造1、2、3、...n的概率均为1/n,要求复杂度最低。 - - - - -## 两个圆相交 - -两个圆相交,交点是A1,A2。现在过A1点做一直线与两个圆分别相交另外一点B1,B2。B1B2可以绕着A1点旋转。问在什么情况下,B1B2最长 - - - - -## 输入四个点的坐标,求证四个点是不是一个矩形 - -关键点: -1.相邻两边斜率之积等于-1, -2.矩形边与坐标系平行的情况下,斜率无穷大不能用积判断。 -3.输入四点可能不按顺序,需要对四点排序。 - - - - -## 排列组合问题 - - -## 1,2,3,4,5 五个不同的数字,打印不同的排列。这就是一个无向图的遍历,把每个数字看成一个节点。 - - -## 用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, - -如:512234、412345 等,要求:"4"不能在第三位,"3"与"5"不能相连. - -这是对上一题增加难度。但是需要 -1. 去掉 3,5之间的联通 -2. 2重复,过滤重复结果 treeset -3. 4不能在3位 - - - - - - diff --git "a/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" "b/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" new file mode 100644 index 0000000..463fcb1 --- /dev/null +++ "b/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" @@ -0,0 +1,93 @@ +# 数值-加减乘除 + + + +## 求1+2+…+n + +要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 + +思路:这是等差数列求和公式, 1+2+3.......+N =(n+1)n/2 + +分析: +1. 不能使用循环,那就用递归 +2. 递归需要终止递归的条件判断语句,这里也不能用if,想其他办法,可以使用 &&逻辑与 运算符(在n>0条件满足是,才会指向后面的递归语句) + +``` +int sum(n){ + int sum=0; + (n>0) && sum=n+factorial(n-1) + return sum; +} +``` + + + + +## 大数阶乘(factorial) + +> 阶乘 n*(n-1)*(n-2)*...*1 + +主要考虑算出来的结果肯定会大于int表达的范围,这时候怎么处理? + +``` +int factorial(n){ + int sum=0; + (n>0) && sum=n+factorial(n-1) + return sum; +} +``` + +考虑整数溢出情况 + +``` +char[] factorial(int n){ + int sum=0; + return sum; +} + +``` + + + +## 实现两个正整数的除法(和取模) + +编程实现两个正整数的除法,当然不能用除法操作符。 +``` +int div(const int x, const int y) +``` + +1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 +2. 位运算 + + + + + +## 大整数乘法(或 大整数阶乘) + +请使用代码计算`1234567891011121314151617181920*2019181716151413121110987654321` 。 + +1. 注意结果可能超出长整形的最大范围 2^64-1 +2. 采用分治算法,将大整数相乘转换为小整数计算 + +规律分析:任意位数的整数相乘,最终都可以转化为2位数相乘 + + + +## 两个数相乘,小数点后位数没有限制,请写一个高精度算法 + + + + + + +## 1024! 末尾有多少个0? + +分析: +末尾0的个数取决于2和5的个数 +能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 + + + + + diff --git "a/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" "b/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" new file mode 100644 index 0000000..371b804 --- /dev/null +++ "b/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" @@ -0,0 +1,103 @@ +# 4.2 数值-指数 + + +> 在a^n中,a叫做底数,n叫做指数。a^n读作“a的n次方”或“a的n次幂“ + + + +## 数值的整数次方 + +题目:实现函数`double Power(double base, int exponent)`,求base的exponent次方。 + +不需要考虑溢出。 + +分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码: +``` +double Power(double base, int exponent) +{ + double result = 1.0; + for(int i = 1; i <= exponent; ++i) + result *= base; + return result; +} +``` + + +上面的代码没有考虑: exponent<=0 +判断一个浮点数是不是等于0时,不是直接写 base == 0 ,而应该判断它们的差的绝对值是不是小于一个很小的范围 + +如果指数大于0,我们还可以使用递归实现:`a^n = a^(n/2)*a^(n/2)` (n为偶数), 通过这个思路也可以实现 +``` +2^16 = 2^8 * 2^8 +2^8 = 2^4 * 2^4 +2^4 = 2^2 * 2^2 +2^2 = 2^1 * 2^1 +2^1 = 2 +``` + +用例: + +``` +2 3 = 8 +0 3 = 0 +2 0 = 1 +2 -3 = 1/(2^3) = 0.125 +0 -3 +``` + +使用递归实现的代码示例: + +``` +double Power(double base, unsigned int exponent) +{ + if (exponent == 0) return 1; + if (exponent == 1) return base; + double result = Power(base, exponent >> 1); + result *= result; + + if (exponent & 1) result = result*base; + + return reslut; +} +``` + + +## 求根号2的值 + +并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 + +分析: +泰勒级数 +牛顿迭代法 + + + + + + +## 判断一个自然数是否是某个数的平方 + +说明:当然不能使用开方运算。 + +``` +square(25) YES +square(35) NO +``` + +方法1: 从1开始遍历,显然这种方法很差 +方法2: 除数跟余数比较,除数从2开始,每一轮都跟结果比较;相等就是存在这个数,不相等就把除数++;时间复杂度为(根号n)。在一个数比较大时,效率不够好。如1194877489 =(34567)^2,需要从2开始,一直比较到34566,做3万多次除法和比较运算。跟方法1一样。。 + +方法3:二分查找 O(logn)。比如25: + +a. 先取(0+25)/2=12.5,12.5*12.5>25,因此这个数应该小于12.5 +b.(0+12)/2 = 6, 6*6>25 +c. (0+6)/2 = 3 +d. (3+6)/2 = 4.5 +e. (5+6)/2 = 5.5 + +``` +int is_powered(int num) +``` + + + diff --git "a/9 Algorithms Job Interview/4.3 \346\225\260\345\200\274-\351\232\217\346\234\272\346\225\260.md" "b/9 Algorithms Job Interview/4.3 \346\225\260\345\200\274-\351\232\217\346\234\272\346\225\260.md" new file mode 100644 index 0000000..fc74070 --- /dev/null +++ "b/9 Algorithms Job Interview/4.3 \346\225\260\345\200\274-\351\232\217\346\234\272\346\225\260.md" @@ -0,0 +1,21 @@ +# 4.3 数值-随机数 + + + + +## 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。 + + + +## 设计一个随机算法 + +给你5个球,每个球被抽到的可能性为30、50、20、40、10,设计一个随机算法,该算法的输出结果为本次执行的结果。输出A,B,C,D,E即可。 + + +## 构造一个随机发生器 + +已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器, +使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、2、3的概率均为1/3;..., +构造一个发生器,使得它构造1、2、3、...n的概率均为1/n,要求复杂度最低。 + + diff --git "a/9 Algorithms Job Interview/4.4 \346\225\260\345\200\274-\346\234\200\345\260\217\345\205\254\345\200\215\346\225\260.md" "b/9 Algorithms Job Interview/4.4 \346\225\260\345\200\274-\346\234\200\345\260\217\345\205\254\345\200\215\346\225\260.md" new file mode 100644 index 0000000..7b835a1 --- /dev/null +++ "b/9 Algorithms Job Interview/4.4 \346\225\260\345\200\274-\346\234\200\345\260\217\345\205\254\345\200\215\346\225\260.md" @@ -0,0 +1,25 @@ +# 4.4 数值-最小公倍数 + + + +求两个或N个数的最大公约数和最小公倍数? + +> 最大公约数: 12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数 +> 最小公倍数: 45和30的最小公倍数是多少? +> 定理: (a,b)x[a,b]=ab ; (a,b) 是 a,b 的 最大公约数, [a,b]是a,b 的 最小公倍数 + + + +### 最小公倍数应用场景 + + +甲、乙、丙三人是朋友,他们每隔不同天数到图书馆去一次。甲3天去一次,乙4天去一次,丙5天去一次。有一天,他们三人恰好在图书馆相会,问至少再过多少天他们三人又在图书馆相会? + + +一块砖长20厘米,宽12厘米,厚6厘米。要堆成正方体至少需要这样的砖头多少块? + + +甲每秒跑3米,乙每秒跑4米,丙每秒跑2米,三人沿600米的环形跑道从同一地点同时同方向跑步,经过多少时间三人又同时从出发点出发? + + + diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index 9dcf99b..fad9f1d 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -66,6 +66,17 @@ int binary_search_lash(int *a,int length,int key); + +## 大于K的最小正整数 + +给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 + +比如,A=[1,0] K=21 那么输出结构应该为100。 + + + + + ## 查找最小的k个元素(top-k) 题目:输入n个整数,输出其中最小的k个。 diff --git "a/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" "b/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" new file mode 100644 index 0000000..28f2057 --- /dev/null +++ "b/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" @@ -0,0 +1,40 @@ +# 其他 + + + +## 两个圆相交 + +两个圆相交,交点是A1,A2。现在过A1点做一直线与两个圆分别相交另外一点B1,B2。B1B2可以绕着A1点旋转。问在什么情况下,B1B2最长 + + + + +## 输入四个点的坐标,求证四个点是不是一个矩形 + +关键点: +1.相邻两边斜率之积等于-1, +2.矩形边与坐标系平行的情况下,斜率无穷大不能用积判断。 +3.输入四点可能不按顺序,需要对四点排序。 + + + + +## 排列组合问题 + + +## 1,2,3,4,5 五个不同的数字,打印不同的排列。这就是一个无向图的遍历,把每个数字看成一个节点。 + + +## 用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列, + +如:512234、412345 等,要求:"4"不能在第三位,"3"与"5"不能相连. + +这是对上一题增加难度。但是需要 +1. 去掉 3,5之间的联通 +2. 2重复,过滤重复结果 treeset +3. 4不能在3位 + + + + + From 2bfdadce920d3b838e001fca189a94d4462b62e6 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 9 Sep 2021 14:25:55 +0800 Subject: [PATCH 092/151] update bt,list --- ...60\345\200\274\351\227\256\351\242\230.md" | 42 +- ...60\345\210\227\351\227\256\351\242\230.md" | 500 +----------------- ...0\345\210\227-\346\216\222\345\272\217.md" | 128 +++++ ...5\210\227-nsum\351\227\256\351\242\230.md" | 185 +++++++ ...7-\344\272\244\345\271\266\351\233\206.md" | 27 + ...0\345\210\227-\346\237\245\346\211\276.md" | 132 +++++ ...7 \344\272\214\345\217\211\346\240\221.md" | 136 +---- ...1\346\240\221-\351\201\215\345\216\206.md" | 67 +++ ...1\346\240\221-\345\273\272\346\240\221.md" | 24 + .../97 \345\205\266\344\273\226.md" | 21 + 10 files changed, 648 insertions(+), 614 deletions(-) create mode 100644 "9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" create mode 100644 "9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" create mode 100644 "9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" create mode 100644 "9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" create mode 100644 "9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" create mode 100644 "9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 60bedec..afe39d6 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -51,7 +51,6 @@ int one_appear_count_by_binary(int num){ - ## 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列 分析: @@ -103,4 +102,45 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; +## 输出1到最大的N位数 + +题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。 + +分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。 +输入4,输出: 1,2,3,。。9999 +输入5,输出: 1,2,3,4,...99999 + +玄机一: 整数溢出 + + + + +## 寻找丑数 + +题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。 +例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。 +求按从小到大的顺序的第1500个丑数。 + +分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。 + +这里的因子应该不包含本身,因此这个序列应该是这样: +1,2,3,4,5,6,8,9,10,12,15,16,18,20,28.... + + +1)所有的偶数都在序列中 +2)3的倍数也在序列中 +3)5的倍数也在系列中 + + +0. 2,3,5最小公倍数是30 +1. [1,30]符合条件有22个 +2. [30,60]符合条件也22个 + +第1500个: `1500/22=68` 余 4,一个周期内的前4个数是2,3,4,5; 最终答案是`68*30+5` + + + + + + diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index fad9f1d..c4ecd31 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -19,172 +19,27 @@ -## 使用归并排序对一个 int 类型的数组排序 - -比如 [1, 6, 2, 2, 2, 3] - -``` -void sort(int * a, int length) -``` - - - -## 数组中超过出现次数超过一半的数字 - -题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 - -`+-1 计数法` - - - -## 找数组里面重复的一个数 - -找数组里面重复的一个数,一个含n个元素的整数数组至少存在一个重复数,请编程实现,在O(n)时间内找出其中任意一个重复数。 - -1. hash算法,空间要求多 (注意数组元素要是int类型),数的大小范围和数组长度N都可以是无穷大,这里使用hash算法,空间复杂度是O(n),空间可能无法满足条件。 -2. 先排序,复杂度n(logn);然后遍历一遍就可以知道哪些数重复了。 -2. 高级解法: 将问题转化为 `判断单链表中存在环` - - -类似问题:找出数组中唯一的重复元素 - - - -## 数组中找出某数字出现的次数 - -在排序数组中,找出给定数字的出现次数。比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。 - -分析: -1. 因为是排序数组,可以使用二分查找 -2. 将二分查找坚持到底,这样在最坏的情况下([2,2,2,2,2,2,2])都有0(lgn)复杂度 - -``` -int binary_search_first(int *a,int length,int key); -int binary_search_lash(int *a,int length,int key); -``` - - - - -## 大于K的最小正整数 - -给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 - -比如,A=[1,0] K=21 那么输出结构应该为100。 - - - - - -## 查找最小的k个元素(top-k) - -题目:输入n个整数,输出其中最小的k个。 -例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 - -``` -topMinK(int *a,int length,int k); -topMaxK(int *a,int length, int k); -``` - - -1. 全部排序 复杂度 NlogN , 数据了较大时,内存可能承受不住 -2. 部分排序 维护一个大小为K的数组,由大到小排序,然后遍历所有数据,每个数据跟数组中最小元素比较,如果比最小元素大,就要插入数组了,这里还有寻找插入位置,移动数组元素的cpu消耗。复杂度是N*K -3. 堆排序 。在这的K较大时(比如这道题目:2亿个整数中求最大的100万之和),上面的算法还是有很多可以改进的地方,如采用二分查找定位插入位置,移动数组元素的计算是躲不过去了。那有没有什么数据结构即能`快速查找,还能快速移动元素`呢?最好是O(1)复杂度。 - -答案就是`二叉堆`。我们可以遍历总量中的每个元素来跟二叉堆中的堆顶元素比较(堆顶元素在`小根堆`中最小值,在`大根堆`中是最大值),这样在0(1)复杂度就可以完成查找操作,揭下来需要的操作就是重新调整推结构,复杂度是O(logk),因此整个操作复杂度是 `O(n*logk)` - - -`top-k 小的时候用 *大根堆* ,top-k 大得时候用 *小根堆*` - - -## 找第k大的数 - -比如 1,2,3,4,5,6,7和8这8个数字,低3大的数字是 6 - -``` -int topK(int * a, int length, int k) -``` - - - -## 最长公共子序列 (动态规划的经典题目) - -【最大/小差问题】 -求相邻元素的最大差值,有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间 - -如 【9,-1,-11,2】 最大差值 = 2-(-11) = 13 - -最小差 hash合并 -最大差 hash分解 -桶排序 - -`桶排序` 比快排还快,最耗空间 - - - -## 找出和为m的2个数 -输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 -要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 -例如输入数组【1、2、4、7、11、15=和数字15。由于4+11=15,因此输出4和11。 - - -``` -//返回0找到,返回-1没找到 -int findaddends(int *data,int length,int sum,int *a,int *b); -``` - -分析: -数组升序排列,查找可用二分查找,时间复杂度`O(logn)`,这样问题就变成了找其中一个加数的问题,复杂度为`N*logN` - -巧妙解法:数组2端向中间扫描,复杂度O(N) - - -## 求连续子数组和为m的组合 - -数组 [2,3,1,2,4,3]求连续子数组sum=7, 结果[1,2,4] [3,4] - -* 暴力遍历 -* 滑动窗口, 左指针,右指针 - -``` -if summax){ - max=maxendinghere; - } - - } - - return max; - } -``` +2. 直接二分查找 @@ -259,56 +75,6 @@ print_sum_detials(int n , int sum) -## 数组分隔成和相等的2个子集 - -给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等 (eetcode 416, 难度中等) - -思路: 动态规划 - - - -## 奇偶分离 - -给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 -要求:空间复杂度O(1),时间复杂度为O(n) -如 [4,5,2,7,5] => [5,7,5,4,2], -空间复杂度O(1),得使用 交换排序 - -插入排序思想 -快速排序思想 - - - -1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. -每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间, -能否设计一个算法实现? - -分析:难点在于 `不用辅助空间`。 - -思路一: `sum(数组元素的总和)-sum(1~1000)` 得到的差即为重复元素,N较大时注意总和溢出 -思路二: 异或操作(位运算) - - - - -## 找出数组中两个只出现一次的数字 - -题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。 -请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 - -分析:这是一道很新颖的关于位运算的面试题。 - -1) 任何一个数字异或自己都等于0,如果是只有1个只出现一次的的数字,问题就简单了。 -2) - - - - -## 用递归的方法判断整数组a[N]是不是升序排列 - -递归 isAscend(n-1) && a[N-1]< a[N] - - 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。 @@ -340,32 +106,6 @@ print_sum_detials(int n , int sum) -## 扑克牌的顺子 - -从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 -2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 - -对这5个数(大小王看做0) -1)排序,如快排 -2)统计0的个数 -3)统计相邻元素空缺总数 - -``` -//5个是不是顺子 -isShunZi(int *a,int length) -``` - - - -## n个骰子的点数 - -把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。 -输入n,打印出S的所有可能的值出现的概率。 - -如n=1,值`【1,2,3,4,5,6】`每个概率是 `1/6` -如n=2,值`【1~12】` 概率。。 - - ## 把数组排成最小的数 @@ -390,15 +130,6 @@ isShunZi(int *a,int length) -## 分割数组 - -一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。 -能否只用一个额外数组和少量其它空间实现。 - -`快速排序` - - - ## 约瑟夫环问题 n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, @@ -418,69 +149,6 @@ n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, -## 圆形和正方形是否相交 - -用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交 -3D坐标系 原点(0.0,0.0,0.0) -圆形: -半径r = 3.0 -圆心o = (*.*, 0.0, *.*) - -正方形: -4个角坐标; -1:(*.*, 0.0, *.*) -2:(*.*, 0.0, *.*) -3:(*.*, 0.0, *.*) -4:(*.*, 0.0, *.*) - -分析: - -2个形状不相交: - - - -## 两个序列和只差最小 - -有两个序列a,b,大小都为n,序列元素的值任意整数,无序; -要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 -例如: -``` -var a=[100,99,98,1,2, 3]; -var b=[1, 2, 3, 4,5,40]; -``` - - - -## 重新排列使负数排在正数前面 - -一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序 - -比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1)。(此题一直没看到令我满意的答案,一般达不到题目所要求的:时间复杂度O(N),空间O(1),且保证原来正负数之间的相对位置不变)。 - -updated:设置一个起始点j, 一个翻转点k,一个终止点L -从右侧起 -起始点在第一个出现的负数, 翻转点在起始点后第一个出现的正数,终止点在翻转点后出现的第一个负数(或结束) -如果无翻转点, 则不操作 -如果有翻转点, 则待终止点出现后, 做翻转, 即ab => ba 这样的操作 -翻转后, 负数串一定在左侧, 然后从负数串的右侧开始记录起始点, 继续往下找下一个翻转点 - -例子中的就是 - -1, 7, -5, 9, -12, 15 -第一次翻转: 1, 7, -5, -12,9, 15 => 1, -12, -5, 7, 9, 15 -第二次翻转: -5, -12, 1, 7, 9, 15 - - N维翻转空间占用为O(1)复杂度是2N;在有一个负数的情况下, 复杂度最大是2N, ;在有i个负数的情况下, 复杂度最大是2N+2i, 但是不会超过2N+N实际的复杂度在O(3N)以内 - 但从最终时间复杂度分析,此方法是否真能达到O(N)的时间复杂度,还待后续考证。感谢John_Lv,MikovChain。2012.02.25。 - -1, 7, -5, -6, 9, -12, 15(后续:此种情况未能处理) -1 7 -5 -6 -12 9 15 -1 -12 -5 -6 7 9 15 --6 -12 -5 1 7 9 15 - -更多请参考此文,程序员编程艺术第二十七章:重新排列数组(不改变相对顺序&时间O(N)&空间O(1),半年未被KO)http://blog.csdn.net/v_july_v/article/details/7329314。 - - ## 求最大重叠区间大小 @@ -498,115 +166,7 @@ updated:设置一个起始点j, 一个翻转点k,一个终止点L 比如两对括号可以有两种:()()和(()) - - - -## 输出1到最大的N位数 - -题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。 - -分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。 -输入4,输出: 1,2,3,。。9999 -输入5,输出: 1,2,3,4,...99999 - -玄机一: 整数溢出 - - - - -## 和为n连续正数序列 - -题目:输入一个正数n,输出所有和为n连续正数序列。 - -例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 - -``` -print_continuous_sequence_sum(int n) -``` - -思路一:枚举法。从1开始一直加到等于n,再从2开始。。一直到 n/2+1,在每一轮,都要逐步比较。复杂度`O(N^2)` -思路二: a[small,big] sum[small,big]>N small往前移动,否则,big往前移动。 `O(N)` 复杂度搞定 - - -## 找出和为N+1的2个数 - -一个整数数列,元素取值可能是`1~N`(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。 -设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于`N+1`。 -复杂度最好是 `O(n)` ,如果是 `O(n2)`则不得分。 - - -分析:列出所有的数对,如输入15,输出`【1,14】【2,13】【3,12】。。。` - -``` -int print_sequence_sum(int n) -``` - - -## 寻找丑数 - -题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。 -例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。 -求按从小到大的顺序的第1500个丑数。 - -分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。 - -这里的因子应该不包含本身,因此这个序列应该是这样: -1,2,3,4,5,6,8,9,10,12,15,16,18,20,28.... - - -1)所有的偶数都在序列中 -2)3的倍数也在序列中 -3)5的倍数也在系列中 - -0. 2,3,5最小公倍数是30 -1. [1,30]符合条件有22个 -2. [30,60]符合条件也22个 - -第1500个: `1500/22=68` 余 4,一个周期内的前4个数是2,3,4,5; 最终答案是`68*30+5` - - - -## 调整数组顺序使奇数位于偶数前面 - -题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, -所有偶数位于数组的后半部分。要求时间复杂度为O(n)。 - -思路:两边向中间扫描,如果第一个指针是偶数,第二个指针是奇数,就交换;如果第一个是偶数,第二个也偶数,第二个指针向前移;反之,第一个指针向后移 - -``` -void reorder(int *data, int length); -``` - - -## 在从1到n的正数中1出现的次数 - -题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 - -例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 -分析:这是一道广为流传的google面试题。 -``` -int one_appear_count(int n); -``` - -思路1. 遍历`1~n`,统计出现1的个数;n足够大时,效率很低 -思路2. 分析规律 - - - -## 求一个数组的最长递减子序列 - - 比如`{9,4,3,2,5,4,3,2}`的最长递减子序列为`{9,5,4,3,2}` - -`动态规划` - - - -## 如何求2个集合的交集 - -1.每个集合里面是否有重复元素? - -思路一:hash,复杂度O(M+N) ## 两两之差绝对值最小的值 @@ -635,46 +195,6 @@ int one_appear_count(int n); -## 最长递增子序列 - -题目描述:设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列 -Lin=< aK1,ak2,…,akm >,其中k1< k2<…< km且aK1< ak2<…< akm。 -求最大的m值。 - -如【5,6,7,3,2,8】 最长子序列 【5,6,7,8】 - -`动态规划` - - - - -## Fibonacci数列 - -题目:定义Fibonacci数列如下: - / 0 n=0 -f(n)= 1 n=1 - / f(n-1)+f(n-2) n=2 - -输入n,用最快的方法求该数列的第n项。 - -虽然fibonacci数列是`递归`的经典应用,但递归效率很差,会有很多重复的计算,复杂度是成指数递增的,我测试了下计算50的时候已经要300s了。 - -思路二:从下往上计算,复杂度O(N),一个循环就搞定 - -思路三: logN - - - - - -## 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值 - - 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; - {3,6}{2,4,3} m=2 - {3,3}{2,4}{6} m=3 所以m的最大值为3 - - - ////////////// 数列 /////////////// diff --git "a/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" "b/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" new file mode 100644 index 0000000..c4d2950 --- /dev/null +++ "b/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" @@ -0,0 +1,128 @@ +# 5.1 数列-排序 + + +## 使用归并排序对一个 int 类型的数组排序 + + +比如 [1, 6, 2, 2, 2, 3] + +``` +void sort(int * a, int length) +``` + + + +## 用递归的方法判断整数组a[N]是不是升序排列 + +递归 isAscend(n-1) && a[N-1]< a[N] + + + + +## 求一个数组的最长递减子序列 + + 比如`{9,4,3,2,5,4,3,2}`的最长递减子序列为`{9,5,4,3,2}` + +`动态规划` + + + + + +## 扑克牌的顺子 + +从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 +2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 + +对这5个数(大小王看做0) +1)排序,如快排 +2)统计0的个数 +3)统计相邻元素空缺总数 + +``` +//5个是不是顺子 +isShunZi(int *a,int length) +``` + + + + +## 分割数组 + +一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。 +能否只用一个额外数组和少量其它空间实现。 + +`快速排序` + + + + + +## 调整数组顺序使奇数位于偶数前面 + +题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, +所有偶数位于数组的后半部分。要求时间复杂度为O(n)。 + +思路:两边向中间扫描,如果第一个指针是偶数,第二个指针是奇数,就交换;如果第一个是偶数,第二个也偶数,第二个指针向前移;反之,第一个指针向后移 + +``` +void reorder(int *data, int length); +``` + + + +## 奇偶分离 + +给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 +要求:空间复杂度O(1),时间复杂度为O(n) +如 [4,5,2,7,5] => [5,7,5,4,2], +空间复杂度O(1),得使用 交换排序 + +插入排序思想 +快速排序思想 + + + +1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. +每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间, +能否设计一个算法实现? + +分析:难点在于 `不用辅助空间`。 + +思路一: `sum(数组元素的总和)-sum(1~1000)` 得到的差即为重复元素,N较大时注意总和溢出 +思路二: 异或操作(位运算) + + + + + +## 重新排列使负数排在正数前面 + +一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序 + +比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1)。(此题一直没看到令我满意的答案,一般达不到题目所要求的:时间复杂度O(N),空间O(1),且保证原来正负数之间的相对位置不变)。 + +updated:设置一个起始点j, 一个翻转点k,一个终止点L +从右侧起 +起始点在第一个出现的负数, 翻转点在起始点后第一个出现的正数,终止点在翻转点后出现的第一个负数(或结束) +如果无翻转点, 则不操作 +如果有翻转点, 则待终止点出现后, 做翻转, 即ab => ba 这样的操作 +翻转后, 负数串一定在左侧, 然后从负数串的右侧开始记录起始点, 继续往下找下一个翻转点 + +例子中的就是 + +1, 7, -5, 9, -12, 15 +第一次翻转: 1, 7, -5, -12,9, 15 => 1, -12, -5, 7, 9, 15 +第二次翻转: -5, -12, 1, 7, 9, 15 + + N维翻转空间占用为O(1)复杂度是2N;在有一个负数的情况下, 复杂度最大是2N, ;在有i个负数的情况下, 复杂度最大是2N+2i, 但是不会超过2N+N实际的复杂度在O(3N)以内 + 但从最终时间复杂度分析,此方法是否真能达到O(N)的时间复杂度,还待后续考证。感谢John_Lv,MikovChain。2012.02.25。 + +1, 7, -5, -6, 9, -12, 15(后续:此种情况未能处理) +1 7 -5 -6 -12 9 15 +1 -12 -5 -6 7 9 15 +-6 -12 -5 1 7 9 15 + +更多请参考此文,程序员编程艺术第二十七章:重新排列数组(不改变相对顺序&时间O(N)&空间O(1),半年未被KO)http://blog.csdn.net/v_july_v/article/details/7329314。 + + diff --git "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" new file mode 100644 index 0000000..784d7f4 --- /dev/null +++ "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" @@ -0,0 +1,185 @@ +#数列-nsum问题 + + + + +## 找出和为N+1的2个数 + +一个整数数列,元素取值可能是`1~N`(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。 +设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于`N+1`。 +复杂度最好是 `O(n)` ,如果是 `O(n2)`则不得分。 + + +分析:列出所有的数对,如输入15,输出`【1,14】【2,13】【3,12】。。。` + +``` +int print_sequence_sum(int n) +``` + + +## 找出和为m的2个数 + +输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 +要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 +例如输入数组【1、2、4、7、11、15=和数字15。由于4+11=15,因此输出4和11。 + + +``` +//返回0找到,返回-1没找到 +int findaddends(int *data,int length,int sum,int *a,int *b); +``` + +分析: +数组升序排列,查找可用二分查找,时间复杂度`O(logn)`,这样问题就变成了找其中一个加数的问题,复杂度为`N*logN` + +巧妙解法:数组2端向中间扫描,复杂度O(N) + + + + + +## 求子数组的最大和(最大字段和) + +输入一个整形数组,数组里有正数也有负数。 +数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 +求所有子数组的和的最大值。要求时间复杂度为O(n)。 + +例如输入的数组为`1, -2, 3, 10, -4, 7, 2, -5` ,和最大的子数组为`3, 10, -4, 7, 2` ,因此输出为该子数组的和18。 + +1. 蛮力法 fmax(i,j) 找出最大的值,3重循环 ,复杂度 0(n^3) +2. maxendindhere保存当前累加的和,如果<0,就把maxendinghere清零 , max保存最终的最大和 +``` + int maxSumOfVector(int *data,int length){ + + int max=0; + int maxendinghere = 0; + + if(data==NULL || length<=0){ + return 0; + } + for(int i=0;i < length, i++){ + + maxendinghere+=data[i]; + if(maxendinghere<0){ + maxendinghere=0; + continue; + } + + if(maxendinghere>max){ + max=maxendinghere; + } + + } + + return max; + } +``` + + + + + +## 和为n连续正数序列 + +题目:输入一个正数n,输出所有和为n连续正数序列。 + +例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 + +``` +print_continuous_sequence_sum(int n) +``` + +思路一:枚举法。从1开始一直加到等于n,再从2开始。。一直到 n/2+1,在每一轮,都要逐步比较。复杂度`O(N^2)` +思路二: a[small,big] sum[small,big]>N small往前移动,否则,big往前移动。 `O(N)` 复杂度搞定 + + + + +## 求连续子数组和为m的组合 + +数组 [2,3,1,2,4,3]求连续子数组sum=7, 结果[1,2,4] [3,4] + +* 暴力遍历 +* 滑动窗口, 左指针,右指针 + +``` +if sum是n个不同的实数的序列,L的递增子序列是这样一个子序列 +Lin=< aK1,ak2,…,akm >,其中k1< k2<…< km且aK1< ak2<…< akm。 +求最大的m值。 + +如【5,6,7,3,2,8】 最长子序列 【5,6,7,8】 + +`动态规划` + + + + + + +## 在从1到n的正数中1出现的次数 + +题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 + +例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 +分析:这是一道广为流传的google面试题。 +``` +int one_appear_count(int n); +``` + +思路1. 遍历`1~n`,统计出现1的个数;n足够大时,效率很低 +思路2. 分析规律 + + + + diff --git "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" index 065c72d..a7fba16 100644 --- "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" +++ "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" @@ -7,6 +7,18 @@ * 子树 +二元树的结点定义如下: +``` +struct SBinaryTreeNode // a node of the binary tree +{ + int m_nValue; // value of node + SBinaryTreeNode *m_pLeft; // left child of node + SBinaryTreeNode *m_pRight; // right child of node +}; +``` + + + ## 把二元查找树转变成排序的双向链表 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求`不能创建任何新的结点`,只调整指针的指向。 @@ -21,21 +33,13 @@ 转换成双向链表 `4=6=8=10=12=14=16` -首先我们定义的二元查找树 节点的数据结构如下: -``` - struct BSTreeNode -{ - int m_nValue; // value of node - BSTreeNode *m_pLeft; // left child of node - BSTreeNode *m_pRight; // right child of node -}; -``` 分析:题目要求不能创建任何节点,也就是只能调整各个节点的指向 思路一: + ## 在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 @@ -50,37 +54,11 @@ ``` 则打印出两条路径:`10, 12` 和 `10, 5, 7` 。 -二元树节点的数据结构定义为: - -``` -struct BinaryTreeNode // a node in the binary tree -{ - int m_nValue; // value of node - BinaryTreeNode *m_pLeft; // left child of node - BinaryTreeNode *m_pRight; // right child of node -}; -``` 1. 累加当前节点,累加和大于给定值 2. 不为叶节点,左子树入栈 -## 判断整数序列是不是二元查找树的后序遍历结果 - -题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 -如果是返回true,否则返回false。 -例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: -``` - 8 - / \ - 6 10 - /\ / \ - 5 7 9 11 -``` -因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 - - - ## 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 复杂度如果是O(n2)则不得分。 @@ -108,72 +86,6 @@ struct BinaryTreeNode // a node in the binary tree /\ /\ 11 9 7 5 ``` -定义二元查找树的结点为: -``` -struct BSTreeNode // a node in the binary search tree (BST) -{ - int m_nValue; // value of node - BSTreeNode *m_pLeft; // left child of node - BSTreeNode *m_pRight; // right child of node -}; -``` - - -## 按层打印二叉树 - -输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 -例如输入 - -``` - 8 - /\ - 6 10 -/ \ /\ -5 7 9 11 -``` - -输出`8 6 10 5 7 9 11` - - - - -## 二元树的深度 - -题目:输入一棵二元树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 -例如:输入二元树: -``` - - 10 - / \ - 6 14 - / / \ - 4 12 16 -``` - -输出该树的深度3。 - -二元树的结点定义如下: -``` -struct SBinaryTreeNode // a node of the binary tree -{ - int m_nValue; // value of node - SBinaryTreeNode *m_pLeft; // left child of node - SBinaryTreeNode *m_pRight; // right child of node -}; -``` - -分析:这道题本质上还是考查二元树的遍历。对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。 - - - -## 把一个有序整数数组放到二叉树中? - -分析:本题考察二叉搜索树的建树方法,简单的递归结构。 - -关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。 -而,学会把递归改称非递归也是一种必要的技术。 -毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。 -但是对某些数学问题,就一定要学会用递归去解决。 @@ -181,16 +93,6 @@ struct SBinaryTreeNode // a node of the binary tree 设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分 -二叉树的结点定义如下: - -``` -struct TreeNode -{ - int m_nvalue; - TreeNode* m_pLeft; - TreeNode* m_pRight; -}; -``` 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 @@ -198,18 +100,6 @@ struct TreeNode - -## 俩种方法实现二叉树的前序遍历。 - -递归和非递归 - - -## 恢复树结构 - -有一棵树(树上结点为字符串或者整数),请写代码将树的结构和数据写到一个文件中,并能通过读取该文件恢复树结构。 - - - ## 求一个二叉树中任意两个节点间的最大距离 两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。 diff --git "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" new file mode 100644 index 0000000..376ceab --- /dev/null +++ "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" @@ -0,0 +1,67 @@ +# 二叉树-遍历 + + + + +## 俩种方法实现二叉树的前序遍历。 + +递归和非递归 + + + + +## 按层打印二叉树 + +输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 +例如输入 + +``` + 8 + /\ + 6 10 +/ \ /\ +5 7 9 11 +``` + +输出`8 6 10 5 7 9 11` + + + + +## 二元树的深度 + +题目:输入一棵二元树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 +例如:输入二元树: +``` + + 10 + / \ + 6 14 + / / \ + 4 12 16 +``` + +输出该树的深度3。 + + + +分析:这道题本质上还是考查二元树的遍历。对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。 + + + + +## 判断整数序列是不是二元查找树的后序遍历结果 + +题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 +如果是返回true,否则返回false。 +例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: +``` + 8 + / \ + 6 10 + /\ / \ + 5 7 9 11 +``` +因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 + + diff --git "a/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" "b/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" new file mode 100644 index 0000000..d843691 --- /dev/null +++ "b/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" @@ -0,0 +1,24 @@ +# 二叉树-建树 + + + + + +## 把一个有序整数数组放到二叉树中? + +分析:本题考察二叉搜索树的建树方法,简单的递归结构。 + +关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。 +而,学会把递归改称非递归也是一种必要的技术。 +毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。 +但是对某些数学问题,就一定要学会用递归去解决。 + + + + +## 恢复树结构 + +有一棵树(树上结点为字符串或者整数),请写代码将树的结构和数据写到一个文件中,并能通过读取该文件恢复树结构。 + + + diff --git "a/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" "b/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" index 28f2057..ff0d20f 100644 --- "a/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" +++ "b/9 Algorithms Job Interview/97 \345\205\266\344\273\226.md" @@ -38,3 +38,24 @@ + +## 圆形和正方形是否相交 + +用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交 +3D坐标系 原点(0.0,0.0,0.0) +圆形: +半径r = 3.0 +圆心o = (*.*, 0.0, *.*) + +正方形: +4个角坐标; +1:(*.*, 0.0, *.*) +2:(*.*, 0.0, *.*) +3:(*.*, 0.0, *.*) +4:(*.*, 0.0, *.*) + +分析: + +2个形状不相交: + + From adad6993cc8b2e2d326b583c0d99237afced07e9 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 13 Sep 2021 10:42:01 +0800 Subject: [PATCH 093/151] update string --- .../\347\272\242\351\273\221\346\240\221.md" | 11 +- ...50\346\200\201\350\247\204\345\210\222.md" | 8 +- .../\345\233\236\346\272\257\346\263\225.md" | 19 ++- .../\351\200\222\345\275\222.md" | 55 ++++++++- .../2 \351\223\276\350\241\250.md" | 47 ++++--- ...6\350\241\250-\346\216\222\345\272\217.md" | 13 -- ...\351\223\276\350\241\250-2\346\235\241.md" | 116 +++++++++++++++++- ...60\345\210\227\351\227\256\351\242\230.md" | 46 ++++++- .../7.9 \346\240\221.md" | 0 9 files changed, 264 insertions(+), 51 deletions(-) rename "9 Algorithms Job Interview/7 \346\240\221.md" => "9 Algorithms Job Interview/7.9 \346\240\221.md" (100%) diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index c537fcd..f963509 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -1,10 +1,19 @@ # 红黑树 (red-black tree) +红黑树(Red Black Tree) 是一种自平衡二叉查找树。一种特化的AVL树,在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它可以在O(log n)时间内做查找,插入和删除。 + +它的每个结点都被“着色”为红色或者黑色,这些结点的颜色被用来检测树的平衡性。 + ### 应用场景 -java 中 HashMap、TreeMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 +* java 中 HashMap、TreeMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 关于 HashMap 实现解析参考 [这里](../../3%20HashTable/HashMap%20in%20Java.md) +* 广泛应用Linux 的进程管理、内存管理,设备驱动及虚拟内存跟踪 + + + + diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index cd14e8d..9ea7dab 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -1,10 +1,8 @@ +# 动态规划DP +动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 -## 动态规划DP - -复杂问题不能分解成几个子问题,而分解成一系列子问题; - -DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。 +复杂问题不能分解成几个子问题,而分解成一系列子问题;DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。 状态 状态转移方程 diff --git "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" index e0836c1..4ed4442 100644 --- "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" @@ -1,9 +1,8 @@ - - -## 回溯法 +# 回溯法 也叫 `试探法`。 是一种选优搜索法,按照选优条件搜索,当搜索到某一步,发现原先选择并不优或达不到目标,就退回重新选择。 +回溯算法其实就是我们常说的 DFS 算法,本质上就是一种暴力穷举算法。 一般步骤 @@ -14,11 +13,20 @@ 回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。 -#### 八皇后问题 +## 全排列问题 + +> n 个不重复的数,全排列共有 n! 个 + + + + + +## 八皇后问题 8x8的国际象棋棋盘上放置8个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。任意2个皇后都不能处于同一个 横线,纵线,斜线上。 分析 + 1. 任意2个皇后不能同一行,也就是每个皇后占据一行,通用的,每个皇后也要占据一列 2. 一个斜线上也只有一个皇后 @@ -26,6 +34,7 @@ #### 其它案例 -迷宫问题 +* 迷宫问题 +* 全排列 diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 3a11497..ba9a406 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -1,6 +1,4 @@ - - -## 递归 +# 递归 递归是一种设计和描述算法的有力工具。 递归算法执行过程分 `递推` 和 `回归` 两个阶段 @@ -11,21 +9,66 @@ 2) 确定边界条件 -#### 斐波那契数列 +## 斐波那契数列 fib(n)=fib(n-1)+fib(n-2) +#### 递归实现 -递归实现 ``` +int fib(int N) { + if (N == 1 || N == 2) return 1; + return fib(N - 1) + fib(N - 2); +} +``` + +这个递归的算法效率非常差,存在大量重复计算。 + + +#### 非递归实现 + +我们可以有一个【缓存】,每次遇到一个子问题先去「缓存」里查一查,如果发现之前已经解决过这个问题了,直接把答案拿出来用,不要再耗时去计算了。 ``` +public int fib(int n){ + if (n == 0) return 0; + + //缓存 + int[] dp = new int[n + 1]; -非递归实现 + // base case + dp[0] = 0; dp[1] = 1; + + // 状态转移 + for (int i = 2; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + + return dp[n]; + } ``` +说一个细节优化点,当前状态只和之前的两个状态有关,其实并不需要那么长的一个 DP table 来存储所有的状态,只要想办法存储之前的两个状态就行了。所以,可以进一步优化,把空间复杂度降为 O(1): + +``` +int fib(int n) { + if (n < 1) return 0; + if (n == 2 || n == 1) + return 1; + int prev = 1, curr = 1; + for (int i = 3; i <= n; i++) { + int sum = prev + curr; + prev = curr; + curr = sum; + } + return curr; +} ``` + + + + #### 其它案例 阶乘计算 diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 407d3b4..711d606 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -10,6 +10,14 @@ * 链表中是否有环 +链表结点定义如下: +struct ListNode +{ + int m_nKey; + ListNode* m_pNext; +}; + + 常用解题思路 @@ -19,16 +27,34 @@ -## 输出链表中倒数第k个结点 +## 输出链表中倒数第k个节点 题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 -链表结点定义如下: -struct ListNode -{ - int m_nKey; - ListNode* m_pNext; -}; +思路一:2遍遍历,先遍历一遍链表算出 n 的值,然后再遍历链表计算第 n - k 个节点 +思路二:双指针,一个指针先走k步,然后 两个指针一起同步往前走,前面先走的指针到链表尾部吧,后面的指针刚好是第k个节点 + + +类似的题目还有 + + `删除第k个节点` + `链表的中间结点` : 使用「快慢指针」的技巧 ,慢指针 slow 前进一步,快指针 fast 就前进两步,这样,当 fast 走到链表末尾时,slow 就指向了链表中点。 + + + +## 给定单链表,检测是否有环。 + +``` +int isLinkCicle(Link *head); +``` + +解题思路 + +1. 暴力 +2. 空间换时间,用一个HashMap +3. 快慢指针: 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 + + ## 链表反转 @@ -41,13 +67,6 @@ struct ListNode 输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下: -``` -struct ListNode{ - int m_nKey; - ListNode* m_pNext; -}; -``` - 思路一: 辅助栈,需要一个栈空间 思路二: 反转链表,然后遍历 思路三: 递归实现,将printf语句放在递归调用后面。果然妙极。。 diff --git "a/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" "b/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" index f0f4288..00283e2 100644 --- "a/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" +++ "b/9 Algorithms Job Interview/2.1 \351\223\276\350\241\250-\346\216\222\345\272\217.md" @@ -25,19 +25,6 @@ Node * sort_link_list_increasing_order (Node *pheader): -## 给定单链表,检测是否有环。 - -``` -int isLinkCicle(Link *head); -``` - -解题思路 - -1. 暴力 -2. 空间换时间,用一个HashMap -3. 快慢指针: 使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。 - - 类似的题有: diff --git "a/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" "b/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" index b80c6a6..89d565a 100644 --- "a/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" +++ "b/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" @@ -1,9 +1,6 @@ # 链表-2条 - -## 找出两个链表的第一个公共结点 - -题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为: +链表的结点定义为: ``` struct ListNode { @@ -12,13 +9,39 @@ struct ListNode }; ``` -分析:第一个公共节点,也就是2个链表中的节点的m_pNext 指向的同一个节点。 + +## 找出两个链表的第一个公共结点 + +题目:两个单向链表,找出它们的第一个公共结点。 + +分析:第一个公共节点,也就是2个链表中的节点的m_pNext 指向的同一个节点。 2遍遍历方法: 1. 先遍历2个链表,得到各自的长度,和差sub 2. 长链表先遍历sub个节点,然后2个节点一起遍历 3. 第一次同时指向的同一个节点就是这个commonNode +有没有可能一遍遍历就解决问题呢? + +让 p1 遍历完链表 A 之后开始遍历链表 B,让 p2 遍历完链表 B 之后开始遍历链表 A,这样相当于「逻辑上」两条链表接在了一起。 +空间复杂度为 O(1),时间复杂度为 O(N), 一遍遍历就搞定 + +``` +ListNode getIntersectionNode(ListNode headA, ListNode headB) { + // p1 指向 A 链表头结点,p2 指向 B 链表头结点 + ListNode p1 = headA, p2 = headB; + while (p1 != p2) { + // p1 走一步,如果走到 A 链表末尾,转到 B 链表 + if (p1 == null) p1 = headB; + else p1 = p1.next; + // p2 走一步,如果走到 B 链表末尾,转到 A 链表 + if (p2 == null) p2 = headA; + else p2 = p2.next; + } + return p1; +} +``` + ## 判断俩个链表是否相交 @@ -32,6 +55,81 @@ struct ListNode +## 合并2条有序链表 + +while 循环每次比较 p1 和 p2 的大小,把较小的节点接到结果链表上 + +``` +ListNode mergeTwoLists(ListNode l1, ListNode l2) { + // 虚拟头结点 + ListNode dummy = new ListNode(-1), p = dummy; + ListNode p1 = l1, p2 = l2; + + while (p1 != null && p2 != null) { + // 比较 p1 和 p2 两个指针 + // 将值较小的的节点接到 p 指针 + if (p1.val > p2.val) { + p.next = p2; + p2 = p2.next; + } else { + p.next = p1; + p1 = p1.next; + } + // p 指针不断前进 + p = p.next; + } + + if (p1 != null) { + p.next = p1; + } + + if (p2 != null) { + p.next = p2; + } + + return dummy.next; +} +``` + + +## 合并k个有序链表 + + +相比合并两个有序链表,难点在于,如何快速得到 k 个节点中的最小节点,接到结果链表上? + +就要用到 优先级队列(二叉堆) 这种数据结构,把链表节点放入一个最小堆,就可以每次获得 k 个节点中的最小节点: + + +``` +ListNode mergeKLists(ListNode[] lists) { + if (lists.length == 0) return null; + // 虚拟头结点 + ListNode dummy = new ListNode(-1); + ListNode p = dummy; + // 优先级队列,最小堆 + PriorityQueue pq = new PriorityQueue<>( + lists.length, (a, b)->(a.val - b.val)); + // 将 k 个链表的头结点加入最小堆 + for (ListNode head : lists) { + if (head != null) + pq.add(head); + } + + while (!pq.isEmpty()) { + // 获取最小节点,接到结果链表中 + ListNode node = pq.poll(); + p.next = node; + if (node.next != null) { + pq.add(node.next); + } + // p 指针不断前进 + p = p.next; + } + return dummy.next; +} +``` + + ## 输出两个非降序链表的并集 请修改append函数,利用这个函数实现: @@ -39,3 +137,11 @@ struct ListNode 两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5 。另外只能输出结果,不能修改两个链表的数据。 + + + + + + + + diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index c4ecd31..8e97df9 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -32,11 +32,53 @@ 输入n,用最快的方法求该数列的第n项。 -虽然fibonacci数列是`递归`的经典应用,但递归效率很差,会有很多重复的计算,复杂度是成指数递增的,我测试了下计算50的时候已经要300s了。 +思路一:`递归`,虽然fibonacci数列是`递归`的经典应用,但递归效率很差,会有很多重复的计算,复杂度是成指数递增的,我测试了下计算50的时候已经要300s了。 + +``` +int fib(int N) { + if (N == 1 || N == 2) return 1; + return fib(N - 1) + fib(N - 2); +} +``` 思路二:从下往上计算,复杂度O(N),一个循环就搞定 -思路三: logN +``` +public int fib(int n){ + if (n == 0) return 0; + + //缓存 + int[] dp = new int[n + 1]; + + // base case + dp[0] = 0; dp[1] = 1; + + // 状态转移 + for (int i = 2; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + + return dp[n]; + } +``` + +说一个细节优化点,当前状态只和之前的两个状态有关,其实并不需要那么长的一个 DP table 来存储所有的状态,只要想办法存储之前的两个状态就行了。所以,可以进一步优化,把空间复杂度降为 O(1): + +``` +int fib(int n) { + if (n < 1) return 0; + if (n == 2 || n == 1) + return 1; + int prev = 1, curr = 1; + for (int i = 3; i <= n; i++) { + int sum = prev + curr; + prev = curr; + curr = sum; + } + return curr; +} +``` + diff --git "a/9 Algorithms Job Interview/7 \346\240\221.md" "b/9 Algorithms Job Interview/7.9 \346\240\221.md" similarity index 100% rename from "9 Algorithms Job Interview/7 \346\240\221.md" rename to "9 Algorithms Job Interview/7.9 \346\240\221.md" From d1ad2f3dbb992e23eb7a47be4cfe44f61511765a Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 13 Sep 2021 11:36:49 +0800 Subject: [PATCH 094/151] update sequence --- "0 Numeral/\346\225\260\345\200\274.md" | 16 +++++++++ 7 Search/README.md | 15 ++++++++ ...50\346\200\201\350\247\204\345\210\222.md" | 3 +- .../\345\233\236\346\272\257\346\263\225.md" | 1 - .../\351\200\222\345\275\222.md" | 1 + ...60\345\200\274\351\227\256\351\242\230.md" | 2 ++ ...40\345\207\217\344\271\230\351\231\244.md" | 35 +++++++++++-------- ...0\345\200\274-\347\264\240\346\240\221.md" | 16 +++++++++ ...7-\344\272\244\345\271\266\351\233\206.md" | 18 ++++++++++ ...0\345\210\227-\346\237\245\346\211\276.md" | 20 ++++++++--- 10 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 "9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" diff --git "a/0 Numeral/\346\225\260\345\200\274.md" "b/0 Numeral/\346\225\260\345\200\274.md" index e15e89e..1a43fa5 100644 --- "a/0 Numeral/\346\225\260\345\200\274.md" +++ "b/0 Numeral/\346\225\260\345\200\274.md" @@ -1,4 +1,20 @@ # 数值 +`n&(n-1)` 作用是消除数字 n 的二进制表示中的最后一个 1 + + +一个数和它本身做异或运算(^)结果为 0,即 `a ^ a = 0` + + +不用临时变量交换两个数 + +``` +int a = 1, b = 2; +a ^= b; +b ^= a; +a ^= b; +// 现在 a = 2, b = 1 +``` + diff --git a/7 Search/README.md b/7 Search/README.md index 0c213e9..df64db2 100644 --- a/7 Search/README.md +++ b/7 Search/README.md @@ -36,6 +36,21 @@ int binary_search(int *a,int length,int k){ } ``` + +``` +注意细节 + + + +``` + +如果搜索有序数列是 `[1,2,2,2,2,3]` 这种,想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 4 ; 这时候怎么处理呢? + + + + + + ## 分块查找 块内无序,块之间有序;可以先二分查找定位到块,然后再到块中顺序查找。 diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 9ea7dab..ab5eca7 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -28,5 +28,6 @@ #### 其它案例 -最短路径 +* 最短路径 +* 0-1 背包问题 diff --git "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" index 4ed4442..92d908d 100644 --- "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" @@ -20,7 +20,6 @@ - ## 八皇后问题 8x8的国际象棋棋盘上放置8个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。任意2个皇后都不能处于同一个 横线,纵线,斜线上。 diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index ba9a406..674dfb7 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -8,6 +8,7 @@ 1) 确定递归公式 2) 确定边界条件 +> 自顶向下的递归,自底向上是迭代 ## 斐波那契数列 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index afe39d6..918ae06 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -7,6 +7,8 @@ * 随机数 * 进制转换:位运算 * 大数问题 +* 公倍数 +* 素数 ## ipv4 转 int diff --git "a/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" "b/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" index 463fcb1..5d6a05a 100644 --- "a/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" +++ "b/9 Algorithms Job Interview/4.1 \346\225\260\345\200\274-\345\212\240\345\207\217\344\271\230\351\231\244.md" @@ -1,6 +1,10 @@ # 数值-加减乘除 +* 等差数列 +* 阶乘 + + ## 求1+2+…+n @@ -48,17 +52,11 @@ char[] factorial(int n){ ``` +## 1024! 末尾有多少个0? -## 实现两个正整数的除法(和取模) - -编程实现两个正整数的除法,当然不能用除法操作符。 -``` -int div(const int x, const int y) -``` - -1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 -2. 位运算 - +分析: +末尾0的个数取决于2和5的个数 +能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 @@ -74,18 +72,25 @@ int div(const int x, const int y) -## 两个数相乘,小数点后位数没有限制,请写一个高精度算法 +## 实现两个正整数的除法(和取模) +编程实现两个正整数的除法,当然不能用除法操作符。 +``` +int div(const int x, const int y) +``` +1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 +2. 位运算 + + + + +## 两个数相乘,小数点后位数没有限制,请写一个高精度算法 -## 1024! 末尾有多少个0? -分析: -末尾0的个数取决于2和5的个数 -能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 diff --git "a/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" "b/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" new file mode 100644 index 0000000..e2b8f5a --- /dev/null +++ "b/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" @@ -0,0 +1,16 @@ +# 数值-素树 + +> 如果一个数如果只能被 1 和它本身整除,那么这个数就是素数 + + +## 返回区间 [2, n) 中有几个素数 + +``` +int countPrimes(int n) +``` + + + + + + diff --git "a/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" "b/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" index 0b86d91..7eb6c53 100644 --- "a/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" +++ "b/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" @@ -11,12 +11,30 @@ +## 合并2个有序数列 + + +合并2个有序数列 A 和 B, 其中 A 有足够的空间,也就是把B合并进A数组 + +如 +``` +A = [4,5,6] +B = [1,2,7] +合并后 +A = [1,2,4,5,6,7] +``` + +思路1: +思路2: + + ## 两个序列和之差最小 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 + 例如: ``` var a=[100,99,98,1,2, 3]; diff --git "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" index b9688bd..f1763fa 100644 --- "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" @@ -1,9 +1,6 @@ # 数列-查找 - - - ## 数组中超过出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 @@ -24,6 +21,22 @@ 类似问题:找出数组中唯一的重复元素 +## 查找只出现一次的元素 + +给一个非空整数数组,比如 [2, 2, 3] ,其余元素均出现2次,找出那个只出现一次的元素。 + +思路: 异或运算,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身 + +``` +int singleNumber(vector& nums) { + int res = 0; + for (int n : nums) { + res ^= n; + } + return res; +} +``` + ## 数组中找出某数字出现的次数 @@ -112,7 +125,6 @@ Lin=< aK1,ak2,…,akm >,其中k1< k2<…< km且aK1< ak2<…< akm。 - ## 在从1到n的正数中1出现的次数 From f72365e833a8b45552582062ebf48f469c28e558 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 13 Sep 2021 14:43:50 +0800 Subject: [PATCH 095/151] update sort --- 1 String/README.md | 22 ++++ 4 Tree/README.md | 4 + 6 Sort/README.md | 44 ++++--- ...6\344\270\262-\346\237\245\346\211\276.md" | 40 +++++- ...6\344\270\262-\344\277\256\346\224\271.md" | 4 - ...7-\344\272\244\345\271\266\351\233\206.md" | 2 +- ...7 \344\272\214\345\217\211\346\240\221.md" | 115 +++++++++++------- ...1\346\240\221-\351\201\215\345\216\206.md" | 3 +- 8 files changed, 169 insertions(+), 65 deletions(-) diff --git a/1 String/README.md b/1 String/README.md index f6d73e3..07353c5 100644 --- a/1 String/README.md +++ b/1 String/README.md @@ -22,6 +22,28 @@ * BM +## 滑动窗口 + + +使用滑动窗口解决字符串问题,代码框架 +``` +int left = 0, right = 0; + +while (right < s.size()) { + // 增大窗口 + window.add(s[right]); + right++; + + while (window needs shrink) { + // 缩小窗口 + window.remove(s[left]); + left++; + } +} +``` + + + ## 参考 《Algorithms》 diff --git a/4 Tree/README.md b/4 Tree/README.md index 977ba8a..7837139 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -18,6 +18,10 @@ ## [二叉查找树](2-二叉查找树/二叉查找树.md) +快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 + + + ## [AVL树](3-平衡树AVL/README.md) diff --git a/6 Sort/README.md b/6 Sort/README.md index 91f1b50..6c48a16 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -18,7 +18,7 @@ * 桶排序 -## 交换排序算法 +# 交换排序算法 排序算法的复杂度由 `比较的次数` 和 `交换的次数` 一起决定。 @@ -77,14 +77,18 @@ 递归一次,pivot 左边都比它小,右边都比它大。这是递归,分治的思想。 +> 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 + 对 A[p...r] : -1. 分解:A[p..q-1] A[q+1..r],使得 A[p...q-1]=tmp){ + while(i=tmp){ j--; } if (i1) - { - merge_sort(a,length/2); - merge_sort(a+length/2,length-length/2); - merge_array(a,length/2,a+length/2,length-length/2); - } +归并排序的代码框架如下: + +``` +void sort(int[] nums, int lo, int hi) { + int mid = (lo + hi) / 2; + sort(nums, lo, mid); + sort(nums, mid + 1, hi); + + /****** 后序遍历位置 ******/ + // 合并两个排好序的子数组 + merge(nums, lo, mid, hi); + /************************/ +} +``` @@ -239,7 +253,7 @@ 国外也有人通过舞蹈的方式编排了几种基本的排序算法,非常有趣。[点这里去看看](http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html?from=s1.8-1-1.2) -## 线性排序算法 +# 线性排序算法 上面的算法都是基于比较的排序,时间复杂度最好也是 NlogN.而非基于比较的排序,可以突破NlogN的时间下限。当然,非比较的排序,也是需要有一些限定条件的。 @@ -252,7 +266,7 @@ -### 小结 +# 小结 常见的排序算法都是比较排序,比较排序的时间复杂度通常为 O(n^2) 或 O(nlogn) 但是如果带排序的数字有一些特俗性时,我们可以根据这来设计更加优化的排序算法。 diff --git "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" index e9eb47d..b8f1057 100644 --- "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" @@ -123,6 +123,45 @@ int longest_continuious_number(const char *input,char *output){ ``` + +## 最长无重复子串问题 + +给一个字符串,找出不包含有重复字符的最长子串的长度 +如 ”abcabbcbb“ 输出 3 + +思路1: 两个指针 +思路2: 窗口函数 + + +两个指针窗口函数实现 + +``` +int lengthOfLongestSubstring(string s) { + unordered_map window; + + int left = 0, right = 0; + int res = 0; // 记录结果 + while (right < s.size()) { + char c = s[right]; + right++; + // 进行窗口内数据的一系列更新 + window[c]++; + // 判断左侧窗口是否要收缩 + while (window[c] > 1) { + char d = s[left]; + left++; + // 进行窗口内数据的一系列更新 + window[d]--; + } + // 在这里更新答案 + res = max(res, right - left); + } + return res; +} +``` + + + ## 求最大连续递增数字子串 如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。 @@ -152,7 +191,6 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){ ``` - ## 对称子字符串的最大长度 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 diff --git "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" index 40ccc9e..2eeaef0 100644 --- "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" +++ "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" @@ -2,8 +2,6 @@ - - ## 翻转句子中单词的顺序 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。 @@ -190,8 +188,6 @@ char *proc(char *str){ - - ## 字符串原地压缩 题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 diff --git "a/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" "b/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" index 7eb6c53..d7a9698 100644 --- "a/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" +++ "b/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" @@ -24,7 +24,7 @@ B = [1,2,7] A = [1,2,4,5,6,7] ``` -思路1: +思路1:合并2个数列,变成 `[4,5,6,1,2,7]` , 归因排序即可 思路2: diff --git "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" index a7fba16..2725751 100644 --- "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" +++ "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" @@ -7,6 +7,9 @@ * 子树 +写二叉树的算法题,都是基于递归框架的。我们先要搞清楚 root 节点它自己要做什么,然后根据题目要求选择使用前序,中序,后续的递归框架。 + + 二元树的结点定义如下: ``` struct SBinaryTreeNode // a node of the binary tree @@ -19,8 +22,56 @@ struct SBinaryTreeNode // a node of the binary tree +## 二叉树翻转 + +输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例 + +如输入: +``` + 8 + / \ + 6 10 + /\ / \ +5 7 9 11 +``` +输出: + +``` + 8 + / \ + 10 6 + /\ /\ +11 9 7 5 +``` + +思路:二叉树翻转 , 把二叉树上的每一个节点的左右子节点进行交换 + +``` +// 将整棵树的节点翻转 +TreeNode invertTree(TreeNode root) { + // base case + if (root == null) { + return null; + } + + /**** 前序遍历位置 ****/ + // root 节点需要交换它的左右子节点 + TreeNode tmp = root.left; + root.left = root.right; + root.right = tmp; + + // 让左右子节点继续翻转它们的子节点 + invertTree(root.left); + invertTree(root.right); + + return root; +} +``` + + ## 把二元查找树转变成排序的双向链表 +难度:中等 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求`不能创建任何新的结点`,只调整指针的指向。 ``` @@ -40,71 +91,49 @@ struct SBinaryTreeNode // a node of the binary tree -## 在二元树中找出和为某一值的所有路径 - -题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 - -例如 输入整数22和如下二元树 -``` - 10 - / \ - 5 12 - /\ - 4 7 -``` -则打印出两条路径:`10, 12` 和 `10, 5, 7` 。 - - -1. 累加当前节点,累加和大于给定值 -2. 不为叶节点,左子树入栈 +## 二叉树两个结点的最低共同父结点 -## 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 -复杂度如果是O(n2)则不得分。 +设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分 +输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 -## 二叉树翻转 +分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。 -输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例 -如输入: -``` - 8 - / \ - 6 10 - /\ / \ -5 7 9 11 -``` -输出: -``` - 8 - / \ - 10 6 - /\ /\ -11 9 7 5 -``` +## 求一个二叉树中任意两个节点间的最大距离 +两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。 -## 二叉树两个结点的最低共同父结点 -设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分 -输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 +## 在二元树中找出和为某一值的所有路径 -分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。 +题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 +例如 输入整数22和如下二元树 +``` + 10 + / \ + 5 12 + /\ + 4 7 +``` +则打印出两条路径:`10, 12` 和 `10, 5, 7` 。 -## 求一个二叉树中任意两个节点间的最大距离 +1. 累加当前节点,累加和大于给定值 +2. 不为叶节点,左子树入栈 -两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。 +## 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 +复杂度如果是O(n2)则不得分。 diff --git "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" index 376ceab..f072186 100644 --- "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" +++ "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" @@ -1,9 +1,10 @@ # 二叉树-遍历 +> 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 -## 俩种方法实现二叉树的前序遍历。 +## 2种方法实现二叉树的前序遍历。 递归和非递归 From fc99cdfa710ab04472c56531a70e99936a4927eb Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 20 Sep 2021 13:28:54 +0800 Subject: [PATCH 096/151] update i9w --- 3 Hash Table/LFU.md | 4 -- 3 Hash Table/LRU.md | 1 - 6 Sort/README.md | 4 +- ...6\344\270\262-\346\237\245\346\211\276.md" | 4 +- ...6\344\270\262-\344\277\256\346\224\271.md" | 49 ----------------- ...6\344\270\262-\346\216\222\345\272\217.md" | 54 +++++++++++++++++++ .../2 \351\223\276\350\241\250.md" | 21 +++++++- ...60\345\200\274\351\227\256\351\242\230.md" | 8 +-- ...0\345\200\274-\347\264\240\346\240\221.md" | 2 + ...60\345\210\227\351\227\256\351\242\230.md" | 2 - ...7-\344\272\244\345\271\266\351\233\206.md" | 40 +++++++++++++- ...1\346\240\221-\345\273\272\346\240\221.md" | 1 - .../7.9 \346\240\221.md" | 1 + 9 Algorithms Job Interview/README.md | 2 +- 93 Algorithms In Open Source/YYKit/YYCache.md | 40 +------------- 15 files changed, 128 insertions(+), 105 deletions(-) delete mode 100644 3 Hash Table/LFU.md delete mode 100644 3 Hash Table/LRU.md create mode 100644 "9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" diff --git a/3 Hash Table/LFU.md b/3 Hash Table/LFU.md deleted file mode 100644 index 163f0ad..0000000 --- a/3 Hash Table/LFU.md +++ /dev/null @@ -1,4 +0,0 @@ -# LFU - - - diff --git a/3 Hash Table/LRU.md b/3 Hash Table/LRU.md deleted file mode 100644 index 8d95a56..0000000 --- a/3 Hash Table/LRU.md +++ /dev/null @@ -1 +0,0 @@ -# LRU \ No newline at end of file diff --git a/6 Sort/README.md b/6 Sort/README.md index 6c48a16..adecd62 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -9,8 +9,8 @@ * 插入排序 * 选择排序 * 希尔排序 -* 快排 -* 归并排序 +* 快排 : 选最后一个作为pivot(基数), 将数据分为 左边小于 pivot, 右边大于 pivot +* 归并排序 : * 堆排序 **线性排序算法** diff --git "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" index b8f1057..c7b6aa9 100644 --- "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" @@ -13,7 +13,9 @@ char char_first_appear_once(const char *source) ``` 思路一: 蛮力统计, O(n^2)复杂度 -思路二: 使用hash表,2次扫描,第一次建立hash表 key为字符,value为出现次数;第二次扫描找到第一个value为1的key,时间复杂度O(n) +思路二: 使用hash表,2次扫描 +* 第一次建立hash表 key为字符,value为出现次数; +* 第二次扫描找到第一个value为1的key,时间复杂度O(n) hash表长度 256,字符直接作为key值。需要注意的是 char 的范围是 -128~127,unsigned char 才是0~255 diff --git "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" index 2eeaef0..4b18a11 100644 --- "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" +++ "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" @@ -139,55 +139,6 @@ char *replace_blank(char *source){ - -## 小写字母排在大写字母的前面 - -有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型: - -``` -void proc(char *str) -``` -分析: - -比如:HaJKPnobAACPc,要小写字母前面且不要求保存顺序,可以是:anobcHJKPAACP - -1. 小写字母 a~z 的 ASCII码值是 97~122,A~Z的 ASCII码值是 65~90;0~9 的ASCII码是 48~57 -2. 两边向中间扫描,左边大写右边小写就交换;如果都小写,头指针向前知道找到大写;如果都是大写,尾指针向后找小写; - - -示例代码 - -``` -char *proc(char *str){ - char *start = str; - char *end = str; - if (str == NULL) return NULL; - while(*end != '\0') end++; - end--; - - while(start < end){ - if (*start >= 'A' && *start <= 'Z'){//大写 - if (*end >= 'a' && *end <= 'z'){ - char tmp = *start; - *start = *end; - *end = tmp; - - start++; - } - end--; - }else{//小写 - if (*end >= 'A' && *end <= 'Z'){ - end--; - } - start++; - } - } - return str; -} -``` - - - ## 字符串原地压缩 题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。 diff --git "a/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" "b/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" new file mode 100644 index 0000000..9dd1338 --- /dev/null +++ "b/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" @@ -0,0 +1,54 @@ +# 字符串-排序 + + + + +## 小写字母排在大写字母的前面 + +有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型: + +``` +void proc(char *str) +``` +分析: + +比如:HaJKPnobAACPc,要小写字母前面且不要求保存顺序,可以是:anobcHJKPAACP + +1. 小写字母 a~z 的 ASCII码值是 97~122,A~Z的 ASCII码值是 65~90;0~9 的ASCII码是 48~57 +2. 两边向中间扫描,左边大写右边小写就交换;如果都小写,头指针向前知道找到大写;如果都是大写,尾指针向后找小写; + + +示例代码 + +``` +char *proc(char *str){ + char *start = str; + char *end = str; + if (str == NULL) return NULL; + while(*end != '\0') end++; + end--; + + while(start < end){ + if (*start >= 'A' && *start <= 'Z'){//大写 + if (*end >= 'a' && *end <= 'z'){ + char tmp = *start; + *start = *end; + *end = tmp; + + start++; + } + end--; + }else{//小写 + if (*end >= 'A' && *end <= 'Z'){ + end--; + } + start++; + } + } + return str; +} +``` + + + + diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 711d606..4cf7da9 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -59,8 +59,27 @@ int isLinkCicle(Link *head); ## 链表反转 -三个指针,遍历一遍(0(n)复杂度 +思路一:迭代,三个指针,遍历一遍(0(n)复杂度 +思路一:递归实现,较难理解 + +迭代实现 + +``` +``` + + +递归实现 + +``` +ListNode reverse(ListNode head) { + if (head.next == null) return head; + ListNode last = reverse(head.next); + head.next.next = head; + head.next = null; + return last; +} +``` ## 从尾到头输出链表 diff --git "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" index 918ae06..2a11de2 100644 --- "a/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/4 \346\225\260\345\200\274\351\227\256\351\242\230.md" @@ -9,6 +9,7 @@ * 大数问题 * 公倍数 * 素数 +* 丑数 ## ipv4 转 int @@ -119,11 +120,11 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; ## 寻找丑数 -题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。 -例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。 +> 我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。 +> 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。 + 求按从小到大的顺序的第1500个丑数。 -分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。 这里的因子应该不包含本身,因此这个序列应该是这样: 1,2,3,4,5,6,8,9,10,12,15,16,18,20,28.... @@ -146,3 +147,4 @@ tmp[i] = tmp[i]>=0 ? tmp[i] : tmp[i]+16; + diff --git "a/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" "b/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" index e2b8f5a..d146256 100644 --- "a/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" +++ "b/9 Algorithms Job Interview/4.5 \346\225\260\345\200\274-\347\264\240\346\240\221.md" @@ -14,3 +14,5 @@ int countPrimes(int n) + + diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index 8e97df9..65b823d 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -19,8 +19,6 @@ - - ## Fibonacci数列 题目:定义Fibonacci数列如下: diff --git "a/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" "b/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" index d7a9698..382436d 100644 --- "a/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" +++ "b/9 Algorithms Job Interview/5.3 \346\225\260\345\210\227-\344\272\244\345\271\266\351\233\206.md" @@ -24,10 +24,46 @@ B = [1,2,7] A = [1,2,4,5,6,7] ``` -思路1:合并2个数列,变成 `[4,5,6,1,2,7]` , 归因排序即可 -思路2: +思路1:合并2个数列,变成 `[4,5,6,1,2,7]` , 归因排序即可, 递归思路 +思路2:尾部向头部扫描,将大的值放在尾部 +``` +//尾部向头部扫描,将大的值放在尾部 + static void mergeSequenceList(int[] a, int aSize , int[] b){ + + int len_a = a.length -1; + + int index_a = aSize -1; + int index_b = b.length -1; + + while (index_a >= 0 && index_b >= 0) { + + //2个指针都有值时 + if (a[index_a] >= 0 && b[index_b] >= 0) { + if (a[index_a] > b[index_b]) { + a[len_a--] = a[index_a--]; + }else{ + a[len_a--] = b[index_b--]; + } + } + + //a 无值,b有值 ; 把剩下b放好 + if (index_a < 0 && index_b >= 0) { + while (index_b >= 0) { + a[len_a--] = b[index_b--]; + } + } + + //a 有值,b无值; 把剩下a放好 + if (index_a >=0 && index_b < 0) { + while (index_b >= 0) { + + } + } + } + } +``` ## 两个序列和之差最小 diff --git "a/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" "b/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" index d843691..47ed4c6 100644 --- "a/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" +++ "b/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" @@ -3,7 +3,6 @@ - ## 把一个有序整数数组放到二叉树中? 分析:本题考察二叉搜索树的建树方法,简单的递归结构。 diff --git "a/9 Algorithms Job Interview/7.9 \346\240\221.md" "b/9 Algorithms Job Interview/7.9 \346\240\221.md" index 957ce48..9165b72 100644 --- "a/9 Algorithms Job Interview/7.9 \346\240\221.md" +++ "b/9 Algorithms Job Interview/7.9 \346\240\221.md" @@ -10,4 +10,5 @@ + ## 多叉树的层序遍历 diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index bb16b4c..6fa298e 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -16,7 +16,7 @@ -## [链表](2%20链表) +## [链表](2%20链表.md) 链表处理的常见问题包括: diff --git a/93 Algorithms In Open Source/YYKit/YYCache.md b/93 Algorithms In Open Source/YYKit/YYCache.md index 9e89a78..036396d 100644 --- a/93 Algorithms In Open Source/YYKit/YYCache.md +++ b/93 Algorithms In Open Source/YYKit/YYCache.md @@ -1,40 +1,4 @@ +# YYCache -## YYCache - -[YYCache](https://github.com/ibireme/YYCache.git) 是 iOS 系统上一套线程安全的 `Key-Value` 缓存实现,使用 `Objective-C` 语言实现。`YYCache` 使用 `双向链表队列+hash表结构` 实现。 - -### 用到的算法介绍 - -先来看一下它的数据结构: - -``` -// 这是一个节点的结构 -@interface _YYLinkedMapNode : NSObject { - @package - __unsafe_unretained _YYLinkedMapNode *_prev; // retained by dic - __unsafe_unretained _YYLinkedMapNode *_next; // retained by dic - id _key; - id _value; - NSUInteger _cost; - NSTimeInterval _time; -} -``` - -这里定义了一个双向链表结构,`_prev`,`_next`分别指向前缀节点和后缀节点。 - -``` -@interface _YYLinkedMap : NSObject { - @package - CFMutableDictionaryRef _dic; // do not set object directly - NSUInteger _totalCost; - NSUInteger _totalCount; - _YYLinkedMapNode *_head; // MRU, do not change it directly - _YYLinkedMapNode *_tail; // LRU, do not change it directly - BOOL _releaseOnMainThread; - BOOL _releaseAsynchronously; -} -``` -_dic 就是存储缓存节点的hash结构 -_head 指向链表的头部,_tail指向链表的尾部,组成一个队列结构 - +[YYCache](https://github.com/ibireme/YYCache.git) 是 iOS 系统上一套线程安全的 `Key-Value` 缓存实现,使用 `Objective-C` 语言实现。`YYCache` 缓存使用 `双向链表队列+hash表结构` 实现。 From 0a43530e64a406b6bb8b5108d5002263d53c9e07 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 29 Sep 2021 19:20:38 +0800 Subject: [PATCH 097/151] update --- 6 Sort/README.md | 2 +- 7 Search/README.md | 33 ++++++- .../\351\200\222\345\275\222.md" | 57 ++++++++++++ ...\351\223\276\350\241\250-2\346\235\241.md" | 4 + ...5\210\227-nsum\351\227\256\351\242\230.md" | 44 ++++++++++ .../6 \347\237\251\351\230\265.md" | 87 ++++++++++--------- ...56\345\272\223\347\264\242\345\274\225.md" | 2 +- 91 Algorithms In Big Data/README.md | 3 +- ...06\350\200\214\346\262\273\344\271\213.md" | 3 +- ...4\204\347\220\206\344\271\213Mapreduce.md" | 7 +- .../simhash\347\256\227\346\263\225.md" | 3 +- 11 files changed, 187 insertions(+), 58 deletions(-) diff --git a/6 Sort/README.md b/6 Sort/README.md index adecd62..2099a69 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -149,7 +149,7 @@ ### 归并排序merge -分治算法,必然用到递归 +分治算法(divide-and-conquer),必然用到递归 ; 2个有序数组的合并操作是O(n)的复杂度 因此我们可以将无序的数组,分成2个子数组分别排序,然后再merge,依次类推 diff --git a/7 Search/README.md b/7 Search/README.md index df64db2..20c665e 100644 --- a/7 Search/README.md +++ b/7 Search/README.md @@ -25,9 +25,9 @@ int binary_search(int *a,int length,int k){ int high = length-1; int mid; - while(low k) high = mid-1; } @@ -39,14 +39,41 @@ int binary_search(int *a,int length,int k){ ``` 注意细节 +mid+1/mid-1 , 否则的话,有可能死循环 +while(low <= high) 而不是 while(low target) { + right = mid; // 注意 , 这里没有 -1 + } + } + return left; +} +``` diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 674dfb7..794b88a 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -10,6 +10,7 @@ > 自顶向下的递归,自底向上是迭代 + ## 斐波那契数列 fib(n)=fib(n-1)+fib(n-2) @@ -67,6 +68,62 @@ int fib(int n) { ``` +## 合并有序链表 + + +递归解法 +public static LinkedNode mergeSeqLink2(LinkedNode l1, LinkedNode l2){ + + if(l1 == null){ + return l2; + } + if(l2 == null){ + return l1; + } + + if(l1.value < l2.value){ + l1.next = mergeSeqLink2(l1.next,l2); + return l1; + }else{ + l2.next = mergeSeqLink2(l2.next,l1); + return l2; + } + } +``` + +非递归解法 +``` +public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ + if (l1 == null) return l2; + if (l2 == null) return l1; + + LinkedNode result = new LinkedNode(0); + LinkedNode tmp = result; + + while (l1 != null && l2 != null) { + if (l1.value < l2.value) { + tmp.next = l1; + tmp = tmp.next; //tmp 指针前进 + l1 = l1.next ; //l1 前进 + } else { + tmp.next = l2; + l2 = l2.next; + tmp = tmp.next; + } + } + + if (l1 != null) { + tmp.next = l1; + } + + if (l2 != null) { + tmp.next = l2; + } + + return result.next; + } +``` + diff --git "a/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" "b/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" index 89d565a..7d78f3d 100644 --- "a/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" +++ "b/9 Algorithms Job Interview/2.3 \351\223\276\350\241\250-2\346\235\241.md" @@ -30,14 +30,18 @@ struct ListNode ListNode getIntersectionNode(ListNode headA, ListNode headB) { // p1 指向 A 链表头结点,p2 指向 B 链表头结点 ListNode p1 = headA, p2 = headB; + while (p1 != p2) { // p1 走一步,如果走到 A 链表末尾,转到 B 链表 if (p1 == null) p1 = headB; + else p1 = p1.next; + // p2 走一步,如果走到 B 链表末尾,转到 A 链表 if (p2 == null) p2 = headA; else p2 = p2.next; } + return p1; } ``` diff --git "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" index 784d7f4..65ea410 100644 --- "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" @@ -1,6 +1,50 @@ #数列-nsum问题 +## 数组,找出和为 s 的两个数 + +暴力解法 + +``` +class Solution { + public int[] twoSum(int[] nums, int target) { + int res[] = new int[2]; + for(int i = 0; i < nums.length; i++){ + for(int j = i + 1; j < nums.length; j++){ + if(nums[i] + nums[j] == target){ + res[0] = i; + res[1] = j; + break; + } + } + } + return res; + } +} +``` + +使用 hash表,2遍扫描 + +``` Java +class Solution { + public int[] twoSum(int[] nums, int target) { + int res[] = new int[2]; + Map map= new HashMap<>(); + for(int i = 0; i < nums.length; i++){ + map.put(nums[i], i); + } + for(int i = 0; i < nums.length; i++){ + int temp = target - nums[i]; + if(map.containsKey(temp) && map.get(temp) != i){ + res[0] = map.get(temp); + res[1] = i; + } + } + return res; + } +} + +``` ## 找出和为N+1的2个数 diff --git "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" index 9452412..8f6e1d0 100644 --- "a/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" +++ "b/9 Algorithms Job Interview/6 \347\237\251\351\230\265.md" @@ -3,49 +3,6 @@ 矩阵在计算机中表示就是二维数组。这部分内容都是有关二维数组和矩阵相关的题目。 -## 二维数组中的查找 - -在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 - - -``` -1 3 5 7 -2 5 7 12 -4 6 9 23 -6 9 23 75 -``` - - -``` -int exist_inmatrix(int *matrix,int rows,int cols,int target); -``` - - - -## 矩阵中最大的二维矩阵 - -求一个矩阵中最大的二维矩阵(元素和最大).如: -``` -1 2 0 3 4 -2 3 4 5 1 -1 1 5 3 0 -``` -中最大的是: -``` -4 5 -5 3 -``` - -要求: -(1)写出算法; -(2)分析时间复杂度; -(3)用C写出关键代码 - -``` -int max_sum_submatrix(int *matrix,int rows,int cols,int *tmatrix,int *trows,int tcols) -``` - - ## 顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 @@ -60,6 +17,7 @@ int max_sum_submatrix(int *matrix,int rows,int cols,int *tmatrix,int *trows,int 则依次打印出数字`1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10` 。 分析:包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题。 +难点: 各种边界条件判断,很容易搞错 一圈一圈打印,第一圈origin是(0,0),第二圈是(1,1) @@ -164,6 +122,49 @@ void printArry(int *a,int rows,int columns) +## 二维数组中的查找 + +在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 + + +``` +1 3 5 7 +2 5 7 12 +4 6 9 23 +6 9 23 75 +``` + + +``` +int exist_inmatrix(int *matrix,int rows,int cols,int target); +``` + + + +## 矩阵中最大的二维矩阵 + +求一个矩阵中最大的二维矩阵(元素和最大).如: +``` +1 2 0 3 4 +2 3 4 5 1 +1 1 5 3 0 +``` +中最大的是: +``` +4 5 +5 3 +``` + +要求: +(1)写出算法; +(2)分析时间复杂度; +(3)用C写出关键代码 + +``` +int max_sum_submatrix(int *matrix,int rows,int cols,int *tmatrix,int *trows,int tcols) +``` + + ## 矩阵中的最大上升路径 diff --git "a/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" "b/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" index 3280fea..48048f7 100644 --- "a/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" +++ "b/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" @@ -118,7 +118,7 @@ d=100时,h差不多3个 沿着搜索的路径从root一直到叶节点 -每个节点的关键字个数在【d-1,2d-1】之间,当节点的关键字个数是2t-1时,再加入target就违反了B树定义,需要对该节点进行分裂:已中间节点为界,分成2个包含d-1个关键字的子节点(另外还有一个分界关键字,2*(d-1)+1=2d-1),同时把该分界关键字提升到该叶子的父节点中,如果这导致父节点关键字个数超过2d-1,就继续向上分裂,直到根节点。 +每个节点的关键字个数在【d-1,2d-1】之间,当节点的关键字个数是2t-1时,再加入target就违反了B树定义,需要对该节点进行分裂:已中间节点为界,分成2个包含 `d-1` 个关键字的子节点(另外还有一个分界关键字,`2*(d-1)+1=2d-1)`,同时把该分界关键字提升到该叶子的父节点中,如果这导致父节点关键字个数超过 `2d-1`, 就继续向上分裂,直到根节点。 如下演示动画,往度d=2的B树中插入:` 6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4` diff --git a/91 Algorithms In Big Data/README.md b/91 Algorithms In Big Data/README.md index b7731ea..9a34953 100644 --- a/91 Algorithms In Big Data/README.md +++ b/91 Algorithms In Big Data/README.md @@ -1,5 +1,4 @@ - -## 海量数据处理 +# 海量数据处理 所谓海量数据,就是数据量太大,要么在短时间内无法计算出结果,要么数据太大,无法一次性装入内存。 diff --git "a/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" "b/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" index afbdcfb..a964710 100644 --- "a/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" +++ "b/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" @@ -1,5 +1,4 @@ - -## Hash映射,分而治之 +# Hash映射,分而治之 这里的`Hash映射`是指通过一种映射散列的方式,将海量数据均匀分布在对应的内存或更小的文件中 diff --git "a/91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" "b/91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" index 4b1ef66..79da014 100644 --- "a/91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" +++ "b/91 Algorithms In Big Data/mapreduce/\345\210\206\345\270\203\345\244\204\347\220\206\344\271\213Mapreduce.md" @@ -1,10 +1,9 @@ - -### 分布处理之Mapreduce +# 分布处理之MapReduce MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(归纳)”,及他们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。MapReduce的伟大之处就在于让不熟悉并行编程的程序员也能充分发挥分布式系统的威力。 -##### Mapreduce工作原理 +### Mapreduce工作原理 举一个例子:10年内所有论文(当然有很多很多篇)里面出现最多的几个单词。 @@ -18,7 +17,7 @@ map函数和reduce函数是交给用户实现的,这两个函数定义了任 -##### Hadoop +### Hadoop 谷歌技术有"三宝",GFS、MapReduce和大表(BigTable)。 diff --git "a/91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" "b/91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" index 38b4377..2aa21d0 100644 --- "a/91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" +++ "b/91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" @@ -1,2 +1 @@ - -## simhash算法 +# simhash算法 From 8f0e12be15241ed08b5917c4e9e0abddd854fb71 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 11 Oct 2021 10:35:23 +0800 Subject: [PATCH 098/151] update --- 3 Hash Table/HashMap in Java.md | 6 +-- ...06\346\262\273\347\256\227\346\263\225.md" | 2 +- ...50\346\200\201\350\247\204\345\210\222.md" | 42 ++++++++++++++++--- .../\345\233\236\346\272\257\346\263\225.md" | 17 ++++++++ .../\351\200\222\345\275\222.md" | 7 +++- 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index 4fa6590..f9854d3 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -314,14 +314,14 @@ final Node[] resize() { ### JDK7 和 8 HashMap 有什么区别? -* JDK8 实现引入红黑树,优化链表过长的查询效率 -* 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap) +* JDK8 实现引入红黑树,优化链表过长的查询效率;当链表长度大于8是链表的存储结构会被修改成红黑树的形式, 查询效率从O(N)提升到O(logN)。链表长度小于6时,红黑树的方式退化成链表。 +* 1.7 采用头插法, 链表插入是从链表头部插入 ; 1.8采用尾插法, 因此在resize的时候仍然保持原来的顺序; 解决并发多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap) ### 链表上使用的头插还是尾插方式? -1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 +1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题, 因此在resize的时候仍然保持原来的顺序 ### 多线程下死循环问题 diff --git "a/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" index 87aa1a2..832f8b1 100644 --- "a/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" @@ -19,7 +19,7 @@ #### 大整数乘法 -如 26542123532213598*345987342245553677884 +如 `26542123532213598*345987342245553677884` diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index ab5eca7..5e43aba 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -1,18 +1,40 @@ # 动态规划DP -动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 +动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。复杂问题不能分解成几个子问题,而分解成一系列子问题 ; -复杂问题不能分解成几个子问题,而分解成一系列子问题;DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。 +DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。 -状态 -状态转移方程 -递推关系 动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余` 使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势 +动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是求最值,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 + + + +* 状态 +* 状态转移方程, 这一步最为困难 +* 状态压缩 + + + +### DP 解题模板 + + +``` +# 初始化 base case +dp[0][0][...] = base + +# 进行状态转移 +for 状态1 in 状态1的所有取值: + for 状态2 in 状态2的所有取值: + for ... + dp[状态1][状态2][...] = 求最值(选择1,选择2...) +``` + + ####基本步骤 1. 划分问题 @@ -31,3 +53,13 @@ * 最短路径 * 0-1 背包问题 + + + + + + + + + + diff --git "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" index 92d908d..9599935 100644 --- "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" @@ -13,6 +13,23 @@ 回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。 +## 代码框架 + +``` +result = [] +def backtrack(路径, 选择列表): + if 满足结束条件: + result.add(路径) + return + + for 选择 in 选择列表: + 做选择 + backtrack(路径, 选择列表) + 撤销选择 +``` + + + ## 全排列问题 > n 个不重复的数,全排列共有 n! 个 diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 794b88a..4834141 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -11,6 +11,10 @@ > 自顶向下的递归,自底向上是迭代 +递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 + + + ## 斐波那契数列 fib(n)=fib(n-1)+fib(n-2) @@ -134,5 +138,6 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ 快速排序 -递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 + + From 1bdd96a345efd5a800c74fcb252fee342621ff83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Sat, 16 Oct 2021 01:03:56 +0800 Subject: [PATCH 099/151] =?UTF-8?q?=E7=BA=BF=E6=80=A7=E6=8E=A2=E6=B5=8B?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3 Hash Table/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/3 Hash Table/README.md b/3 Hash Table/README.md index aecec75..409a780 100644 --- a/3 Hash Table/README.md +++ b/3 Hash Table/README.md @@ -97,7 +97,9 @@ hash 表有一个特性, 随着元素越来越多, 新插入一个元素发 ### 线性探测法 -使用大小为M的数组保存N个键值对,当碰撞发生时,直接检查散列表中的下一个位置。 +使用大小为M的数组保存N个键值对,当碰撞发生时,直接检查散列表中的下一个位置,如果发现空位置插入新元素。 + +查找key时,先通过 hash(key) 得到 index, 看index 处 key 是否已经存在,不存在,就向后遍历数组。 ## 数据结构和算法 From 30c899160d74d25ec9c247782888c795b07f48b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Sat, 16 Oct 2021 01:32:20 +0800 Subject: [PATCH 100/151] update rb avl bst tree --- 3 Hash Table/HashMap in Java.md | 2 +- ...7\211\346\237\245\346\211\276\346\240\221.md" | 16 +++++++++++----- .../AVLTree.c" | 3 --- .../README.md" | 16 +++++++++++----- .../\347\272\242\351\273\221\346\240\221.md" | 15 +++++++++++++++ 4 Tree/README.md | 2 -- 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/3 Hash Table/HashMap in Java.md b/3 Hash Table/HashMap in Java.md index f9854d3..30ca859 100644 --- a/3 Hash Table/HashMap in Java.md +++ b/3 Hash Table/HashMap in Java.md @@ -2,7 +2,7 @@ java 中 hashmap的实现原理。 - +[红黑树参考这里](../4%20Tree/9-红黑树%20R-B%20树) ## 数据结构 diff --git "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" index 6e23115..965a982 100644 --- "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" +++ "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" @@ -1,14 +1,16 @@ - -## 二叉查找树 +# 二叉查找树 二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。是指一个空树或者具有下列性质的二叉树: 1. 若任意节点的左子树不为空,则左子树上所有的节点值小于它的根节点值 2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值 3. 任意节点左右子树也为二叉查找树 - 4. 没有键值相等的节点 + 4. 没有键值(key)相等的节点 + +有序的二叉查找树,中序遍历结果是递增的。 + - ``` +``` typedef int ElemType; typedef struct BiSearchTree{ ElemType key; @@ -18,7 +20,7 @@ BiSearchTree *bisearch_tree_insert(BiSearchTree *tree,ElemType node); int bisearch_tree_delete(BiSearchTree **tree,ElemType node); int bisearch_tree_search(BiSearchTree *tree,ElemType node); - ``` +``` 删除节点,需要重建排序树 @@ -107,3 +109,7 @@ int bisearch_tree_delete(BiSearchTree **tree,ElemType node){ } ``` + + + + diff --git "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" index dd1cc3c..fdcb6c3 100644 --- "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" +++ "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/AVLTree.c" @@ -1,7 +1,4 @@ - /* - - 记于2014-2-28 by @nonstriater */ diff --git "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" index f901c47..1eaf3b9 100644 --- "a/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" +++ "b/4 Tree/3-\345\271\263\350\241\241\346\240\221AVL/README.md" @@ -1,9 +1,9 @@ -## 自平衡二叉查找树(AVL tree) +# 自平衡二叉查找树(AVL tree) 自平衡二叉查找树(AVL tree): 首先也是二次查找树,其实 任何2个子树的高度差不大于1 -在删除,插入的过程中不断调整子树的高度,保证平均和最坏情况下都是O(logn) +在删除,插入的过程中不断调整子树的高度,保证查找操作平均和最坏情况下都是O(logn) -Adelson-Velskii 和 Landis 1962年 创造。 +Adelson-Velskii 和 Landis 1962年 创造, 因此叫做 AVL 树。 1) 平衡因子 -1 0 1 节点是正常的。平衡因子 = 左子树高度-右字数高度 2) 除此之外的节点是不平衡的,需要重新平衡这个树。也就是AVL旋转 @@ -33,15 +33,21 @@ d: 先右后左旋转:(RL型:节点X的右孩子的左孩子上插入新元素 (LL型) (RR) (LR) (RL) + ## 删除节点 +可以看到,为了保证高度平衡,插入和删除操作代价增加 + +## AVL 实现过程中的问题 +AVL 是严格的平衡二叉树,平衡条件必须满足,即所有节点的左右子树高度差的绝对值不超过1; -可以看到,为了保证高度平衡,插入和删除操作代价增加 +执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。 +由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部平衡而不是非常严格整体平衡的红黑树()。 -## AVL 实现过程中的问题 + diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index f963509..2d1fdbf 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -10,11 +10,26 @@ * java 中 HashMap、TreeMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 关于 HashMap 实现解析参考 [这里](../../3%20HashTable/HashMap%20in%20Java.md) * 广泛应用Linux 的进程管理、内存管理,设备驱动及虚拟内存跟踪 +* epoll的的的实现采用红黑树组织管理的的的sockfd,以支持快速的增删改查 +* Nginx的的的中用红黑树管理定时器,因为红黑树是有序的,可以很快的得到距离当前最小的定时器 +### RB tree 特点 +* 每个节点非红即黑 +* 根节点是黑的 +* 每个叶节点(叶节点即树尾端NULL指针或NULL节点)都是黑的 +* 如果一个节点是红的,那么它的两儿子都是黑的 +* 对于任意节点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑节点 +* 每条路径都包含相同的黑节点 +在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑);通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍; + +因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)。相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。 + + +也就是说,红黑树牺牲掉一定的平衡性(牺牲查找性能),换来了 插入,删除操作时 更少的旋转次数带来的开销。 diff --git a/4 Tree/README.md b/4 Tree/README.md index 7837139..4eb2054 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -21,8 +21,6 @@ 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 - - ## [AVL树](3-平衡树AVL/README.md) From ae3a9ca588438222069bb14c2e73211b5fe22589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=89=E6=96=87=E6=9D=B0?= <510495266@qq.com> Date: Sat, 16 Oct 2021 01:52:41 +0800 Subject: [PATCH 101/151] update rb tree --- "4 Tree/7-B\346\240\221/B\346\240\221.md" | 5 ++--- .../\347\272\242\351\273\221\346\240\221.md" | 16 +++++++++++++++- ...7\215\345\220\221\347\264\242\345\274\225.md" | 1 - 4 Tree/README.md | 8 +++++--- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git "a/4 Tree/7-B\346\240\221/B\346\240\221.md" "b/4 Tree/7-B\346\240\221/B\346\240\221.md" index b47b461..c2b5121 100644 --- "a/4 Tree/7-B\346\240\221/B\346\240\221.md" +++ "b/4 Tree/7-B\346\240\221/B\346\240\221.md" @@ -1,7 +1,6 @@ +# B树 -## B树 - -平衡查找树,一种多路查找树。 +一种多路平衡查找树。 能保证数据插入和删除情况下,任然保持执行效率。 diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index 2d1fdbf..a33a927 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -7,6 +7,7 @@ ### 应用场景 +* C++ STL的map和set * java 中 HashMap、TreeMap 的底层实现,当HashMap中元素大于8个时,HashMap底层存储实现改为红黑树,以提高元素搜索速度。 关于 HashMap 实现解析参考 [这里](../../3%20HashTable/HashMap%20in%20Java.md) * 广泛应用Linux 的进程管理、内存管理,设备驱动及虚拟内存跟踪 @@ -26,12 +27,25 @@ 在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑);通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍; -因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)。相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。 +因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度低于红黑树)。相对于要求严格的[AVL树](../3-平衡树AVL/README.md)来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,我们就用红黑树。 也就是说,红黑树牺牲掉一定的平衡性(牺牲查找性能),换来了 插入,删除操作时 更少的旋转次数带来的开销。 +### 红黑树 & B+ 树对比 + +* 红黑树多用在内部排序,即全放在内存中的 +* B+树多用于外存上时,B+也被成为一个磁盘友好的数据结构; 这也是为什么 mysql索引使用b+树而不使用红黑树 + + +为什么使用 红黑树 而不是 B+ 树呢?原因如下: + +* 没有范围查找, 不需要 B+ +* 不需要多路平衡树,使用二路平衡,实现简单,且红黑树能兼顾 查找,删除操作的性能 + + + diff --git "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" index 031c7dd..bcb9b23 100644 --- "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" +++ "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" @@ -1,6 +1,5 @@ # 反向索引 - 正排索引如 mysql中的索引实现 ,通常使用 B+ 树实现。 反向索引如何来实现呢? ### 应用场景 diff --git a/4 Tree/README.md b/4 Tree/README.md index 4eb2054..08e1edb 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -5,13 +5,13 @@ * 二叉树 * 二叉查找树 * AVL树 +* 红黑树 +* B树 : B树, B+树(mysql索引使用B+树的数据结构) * 字典树trie(前缀树,单词查找树) * 伸展树 * 后缀树 -* B树 : B树, B+树(mysql索引使用B+树的数据结构) * 红黑树 * 二叉堆(优先队列) -* 红黑树 * Treap 树 * 赫夫曼编码 Huffman @@ -24,6 +24,9 @@ ## [AVL树](3-平衡树AVL/README.md) +## [红黑树](9-红黑树%20R-B%20tree/红黑树.md) + + ## [字典树trie](4-字典树Trie/README.md) 字典树也叫前缀树,单词查找树 @@ -43,7 +46,6 @@ ## [二叉堆](8-堆/堆.md) -## [红黑树](9-红黑树%20R-B%20tree/红黑树.md) ## 赫夫曼编码 Huffman From 533b9fb5e1af1bc4aa2ad9065a59a7b1baf2c8fc Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 18 Oct 2021 15:59:42 +0800 Subject: [PATCH 102/151] update dd --- 4 Tree/README.md | 3 +-- .../\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- ...2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/4 Tree/README.md b/4 Tree/README.md index 7837139..04434dc 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -21,11 +21,10 @@ 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 - - ## [AVL树](3-平衡树AVL/README.md) + ## [字典树trie](4-字典树Trie/README.md) 字典树也叫前缀树,单词查找树 diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 5e43aba..70e2728 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -10,7 +10,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势 -动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是求最值,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 +动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 diff --git "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" index 65ea410..895026f 100644 --- "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" @@ -91,7 +91,7 @@ int findaddends(int *data,int length,int sum,int *a,int *b); 例如输入的数组为`1, -2, 3, 10, -4, 7, 2, -5` ,和最大的子数组为`3, 10, -4, 7, 2` ,因此输出为该子数组的和18。 1. 蛮力法 fmax(i,j) 找出最大的值,3重循环 ,复杂度 0(n^3) -2. maxendindhere保存当前累加的和,如果<0,就把maxendinghere清零 , max保存最终的最大和 +2. maxendindhere保存当前累加的和,如果<0,就把maxendinghere清零 , max保存最终的最大和; 如果都是负数 ``` int maxSumOfVector(int *data,int length){ From 840b6ebf7aeec877e3d4a6686a21cf1a9ddf7d70 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 25 Oct 2021 16:39:57 +0800 Subject: [PATCH 103/151] update algo analysis --- ...06\346\262\273\347\256\227\346\263\225.md" | 3 +- ...50\346\200\201\350\247\204\345\210\222.md" | 50 +++++++++++-------- ...76\346\220\234\347\264\242\346\263\225.md" | 4 +- ...52\345\277\203\347\256\227\346\263\225.md" | 4 +- .../\350\277\255\344\273\243\346\263\225.md" | 3 +- .../\351\200\222\345\275\222.md" | 15 +++--- 6 files changed, 41 insertions(+), 38 deletions(-) diff --git "a/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" index 832f8b1..92f5fe1 100644 --- "a/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" @@ -1,5 +1,4 @@ - -### 分治算法 +# 分治算法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,各个击破,分而治之。 diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 70e2728..fcd1ce0 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -7,22 +7,45 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余` -使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势 +使用动态规划算法的问题的特征是`子问题的重叠性`,`最优子结构` ,否则动态规划算法不具备优势 +动态规划算法也可以说是 `记住求过的解来节省时间` -动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。 +【初始状态】→【决策1】→【决策2】→…→【决策n】→【结束状态】 +### DP 应用场景 +动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说: + +* 最长递增子序列 (LIS Longest Increasing Subsequence) +* 最小编辑距离 +* 0-1 背包问题 +* 凑零钱问题 +* 股票问题 +* 接雨水问题 +* Fibonacci数列 +* 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 + + +### DP VS 分治法 + +与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。 + + + +## DP 解题模板 + + +####基本步骤 + +* 划分问题 * 状态 * 状态转移方程, 这一步最为困难 * 状态压缩 -### DP 解题模板 - - ``` # 初始化 base case dp[0][0][...] = base @@ -35,23 +58,6 @@ for 状态1 in 状态1的所有取值: ``` -####基本步骤 - -1. 划分问题 -2. 选择状态 -3. 确定决策并写出状态转移方程 -4. 写出规划方程 - - -#### 最长递增子序列 - -最长递增子序列(LIS Longest Increasing Subsequence) - - -#### 其它案例 - -* 最短路径 -* 0-1 背包问题 diff --git "a/8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" "b/8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" index 783a715..2da99f3 100644 --- "a/8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" +++ "b/8 Algorithms Analysis/\347\251\267\344\270\276\346\220\234\347\264\242\346\263\225.md" @@ -1,6 +1,4 @@ - - -## 穷举搜索法 +# 穷举搜索法 或者叫蛮力法。对可能的解的众多候选按照某种顺序逐一枚举和检验。典型的问题如选择排序和冒泡排序。 diff --git "a/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" index da6d18a..f5ac09d 100644 --- "a/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" +++ "b/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" @@ -1,6 +1,4 @@ - - -## 贪心算法 +# 贪心算法 不追求最优解,只找到满意解。 diff --git "a/8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" "b/8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" index 8352728..41b808d 100644 --- "a/8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" +++ "b/8 Algorithms Analysis/\350\277\255\344\273\243\346\263\225.md" @@ -1,5 +1,4 @@ - -## 迭代法 +# 迭代法 是一种不断用旧值递推新值的过程,分精确迭代和近视迭代。是用来求方程和方程组近似根的方法。 diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 4834141..c6a8d10 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -14,6 +14,13 @@ 递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 +### 其它案例 + +* 阶乘计算 +* 梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案) +* 快速排序 + + ## 斐波那契数列 @@ -76,6 +83,7 @@ int fib(int n) { 递归解法 +``` public static LinkedNode mergeSeqLink2(LinkedNode l1, LinkedNode l2){ if(l1 == null){ @@ -96,6 +104,7 @@ public static LinkedNode mergeSeqLink2(LinkedNode l1, LinkedNode l2){ ``` 非递归解法 + ``` public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ if (l1 == null) return l2; @@ -131,12 +140,6 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ -#### 其它案例 - -阶乘计算 -梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案) -快速排序 - From 1c152c6afe4fcf1c8bd6557613b4d584703012c5 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 28 Oct 2021 23:53:15 +0800 Subject: [PATCH 104/151] update dp --- ...50\346\200\201\350\247\204\345\210\222.md" | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index fcd1ce0..d8936a5 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -7,7 +7,6 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余` -使用动态规划算法的问题的特征是`子问题的重叠性`,`最优子结构` ,否则动态规划算法不具备优势 动态规划算法也可以说是 `记住求过的解来节省时间` @@ -16,6 +15,10 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 ### DP 应用场景 +如果一个问题,可以把所有可能的答案穷举出来,并且穷举出来后,发现存在重叠子问题,就可以考虑使用动态规划。 + +使用动态规划算法的问题的特征是`子问题的重叠性`,`最优子结构` ,否则动态规划算法不具备优势。 + 动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说: * 最长递增子序列 (LIS Longest Increasing Subsequence) @@ -28,6 +31,22 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 * 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 +``` +# 青蛙跳阶问题 +想跳到第10级台阶,要么是先跳到第9级,然后再跳1级台阶上去;要么是先跳到第8级,然后一次迈2级台阶上去。 +同理,要想跳到第9级台阶,要么是先跳到第8级,然后再跳1级台阶上去;要么是先跳到第7级,然后一次迈2级台阶上去。 +要想跳到第8级台阶,要么是先跳到第7级,然后再跳1级台阶上去;要么是先跳到第6级,然后一次迈2级台阶上去 + +即通用公式为: f(n) = f(n-1) + f(n-2) + +那f(2) 或者 f(1) 等于多少呢? + +当只有2级台阶时,有两种跳法,第一种是直接跳两级,第二种是先跳一级,然后再跳一级。即f(2) = 2; +当只有1级台阶时,只有一种跳法,即f(1)= 1; + +``` + + ### DP VS 分治法 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。 From 4da038278b464127252d6070a2d3fd7871655675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Fri, 5 Nov 2021 10:34:02 +0800 Subject: [PATCH 105/151] =?UTF-8?q?Update=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "8 Algorithms Analysis/\351\200\222\345\275\222.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index c6a8d10..45e7ee3 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -19,6 +19,7 @@ * 阶乘计算 * 梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案) * 快速排序 +* 很多树算法都是递归思想实现 From bd814e6691d982dd16b0c64dfa796e48934d65d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Fri, 5 Nov 2021 10:37:09 +0800 Subject: [PATCH 106/151] =?UTF-8?q?Update=20=E5=8A=A8=E6=80=81=E8=A7=84?= =?UTF-8?q?=E5=88=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\212\250\346\200\201\350\247\204\345\210\222.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index d8936a5..70ff74d 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -56,7 +56,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 ## DP 解题模板 -####基本步骤 +#### 基本步骤 * 划分问题 * 状态 From 8fe17aae46e7fe75181ec856a95a2b489f658133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Fri, 5 Nov 2021 10:44:02 +0800 Subject: [PATCH 107/151] Update README.md --- 6 Sort/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/6 Sort/README.md b/6 Sort/README.md index 2099a69..ac51c25 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -5,9 +5,9 @@ **交换排序算法** -* 冒泡排序 +* 冒泡排序 :没轮确定一个最大的数排后面 * 插入排序 -* 选择排序 +* 选择排序 :每轮选择最小的数排前面 * 希尔排序 * 快排 : 选最后一个作为pivot(基数), 将数据分为 左边小于 pivot, 右边大于 pivot * 归并排序 : From 4b5e2d8b8098f7ae02248515a124390265c3823c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Fri, 5 Nov 2021 13:12:46 +0800 Subject: [PATCH 108/151] Update README.md --- 9 Algorithms Job Interview/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index 6fa298e..08a9ad1 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -15,6 +15,7 @@ * 子串 +数组,字符串问题常用解题套路:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。 ## [链表](2%20链表.md) @@ -60,12 +61,13 @@ ## [二叉树](7%20二叉树.md) +常见问题 * 遍历 * 翻转 * 子树 - +解题思路:递归 ## [图](8%20图.md) From 6c74856e627c74bea2f5e11f1d2cda6fdb5b89b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Sat, 6 Nov 2021 11:13:37 +0800 Subject: [PATCH 109/151] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f91d4d..405f548 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ * Hash * 快速排序 -* 快递选择SELECT +* 快速选择SELECT * BFS/DFS (广度/深度优先遍历) * 红黑树 (一种自平衡的`二叉查找树`) * KMP 字符串匹配算法 From ad152b7814b845af2b7839e8868c80228a9c349c Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 6 Nov 2021 22:03:15 +0800 Subject: [PATCH 110/151] update readme --- 1 String/KMP.md | 7 + 2 List/README.md | 7 + .../\347\272\242\351\273\221\346\240\221.md" | 7 + 4 Tree/README.md | 6 +- "5 Graph/DFS \345\222\214 BFS.md" | 10 +- 5 Graph/README.md | 15 +- ...00\347\237\255\350\267\257\345\276\204.md" | 9 +- 6 Sort/README.md | 132 +++++++++++------- 94 15-Classic-Algorithms/README.md | 9 +- README.md | 18 +-- 10 files changed, 143 insertions(+), 77 deletions(-) create mode 100644 1 String/KMP.md diff --git a/1 String/KMP.md b/1 String/KMP.md new file mode 100644 index 0000000..03d0bd1 --- /dev/null +++ b/1 String/KMP.md @@ -0,0 +1,7 @@ +# 字符串匹配算法 KMP + +KMP于1977年被提出,全称 Knuth–Morris–Pratt 算法; 名字分别是:Donald Knuth(K), James H. Morris(M), Vaughan Pratt(P). + +KMP算法是一种字符串匹配算法,可以在 O(n+m) 的时间复杂度内实现两个字符串的匹配。 + + diff --git a/2 List/README.md b/2 List/README.md index 458996f..1e0460f 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -23,6 +23,13 @@ java 中扩容,每次扩容新增原先容量的 1/2 这个就不介绍了。重点说下双向链表。 +### 链表 VS 数组 + + +* 查询: 数组 O(1), 内存连续, 有序时可以用二分查找;有界 +* 删除: 链表只需要移动指针 O(1) ,数组的话删除元素需要移动后续的元素 O(N) + + ## 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index a33a927..ff83a6d 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -49,3 +49,10 @@ + + + + + + + diff --git a/4 Tree/README.md b/4 Tree/README.md index 78c138a..1b16e27 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -23,10 +23,12 @@ ## [AVL树](3-平衡树AVL/README.md) +绝对的平衡二叉树; ## [红黑树](9-红黑树%20R-B%20tree/红黑树.md) +弱平衡二叉树;使用广泛 ## [字典树trie](4-字典树Trie/README.md) @@ -50,10 +52,6 @@ -## 赫夫曼编码 Huffman - - - diff --git "a/5 Graph/DFS \345\222\214 BFS.md" "b/5 Graph/DFS \345\222\214 BFS.md" index cbfbc4a..ecd990f 100644 --- "a/5 Graph/DFS \345\222\214 BFS.md" +++ "b/5 Graph/DFS \345\222\214 BFS.md" @@ -1,4 +1,12 @@ -# DFS 和 BFS +# DFS 和 BFS 搜索算法 + + +> DFS用递归的形式,用到了栈结构,先进后出; BFS选取状态用队列的形式,先进先出。 + + + + + diff --git a/5 Graph/README.md b/5 Graph/README.md index 7fe21e1..a4d7452 100644 --- a/5 Graph/README.md +++ b/5 Graph/README.md @@ -9,12 +9,12 @@ ### 应用场景 -工业界有哪些应用场景 +工业界有哪些应用场景? * 匹配,如打车中司乘匹配引擎,如何做到效率最优 -* 并行任务调度,一组任务,任务有优先级,如何合理安排任务调度,在最短时间内完成 -* 导航路径规划,在使用导航软件时,用户在选择一个开始地点和目的地之后导航软件会给出各种如路程最短,不走高速,时长最短等方案 -* 社区发现,在好友关系中,根据社区之间联系或紧密,利用图 louvain 算法或者其他算法对用户进行分群从而达到精准营销,个性化服务等 +* 并行任务调度: 一组任务,任务有优先级,如何合理安排任务调度,在最短时间内完成 +* 导航路径规划:在使用导航软件时,用户在选择一个开始地点和目的地之后导航软件会给出各种如路程最短,不走高速,时长最短等方案 +* 社区发现: 在好友关系中,根据社区之间联系或紧密,利用图 louvain 算法或者其他算法对用户进行分群从而达到精准营销,个性化服务等 * 金融贷后催收:利用图算法找出符合条件的失联人的联系人,从而提高催收失联修复的覆盖率、有效联系率,助力不良资产的回收 * 套汇 @@ -45,8 +45,8 @@ #### 遍历 -* 广度优先 -* 深度优先 +* 广度优先 BFS +* 深度优先 DFS Dijkstra A* @@ -67,3 +67,6 @@ https://www.jiqizhixin.com/articles/2019-05-16-14 + + + diff --git "a/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" "b/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" index 38713e8..0b952ad 100644 --- "a/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" +++ "b/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" @@ -1 +1,8 @@ -# 最短路径 \ No newline at end of file +# 最短路径 + + +Dijkstra(迪杰斯特拉) + + + + diff --git a/6 Sort/README.md b/6 Sort/README.md index ac51c25..9cfae22 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -3,21 +3,32 @@ **排序的稳定性** 是指对于相等的元素,排序之后,任然保存2个元素的位置没有变,就是稳定的排序,反之就是不稳定排序。 -**交换排序算法** +* 交换排序算法 +* 桶排序 + +### 交换排序算法 * 冒泡排序 :没轮确定一个最大的数排后面 -* 插入排序 * 选择排序 :每轮选择最小的数排前面 -* 希尔排序 -* 快排 : 选最后一个作为pivot(基数), 将数据分为 左边小于 pivot, 右边大于 pivot -* 归并排序 : -* 堆排序 +* 快排 : 选最后一个作为pivot(基数), 将数据分为 左边小于 pivot, 右边大于 pivot; 分治递归, 二叉树的前序遍历思路 +* 归并排序 : 将无序的数组,分成2个子数组分别排序,然后再merge ; 分治递归, 二叉树的后续遍历思路 +* 插入排序 : +* 希尔排序 : +* 堆排序 : + -**线性排序算法** +### 线性排序算法 * 桶排序 +### 小结 + +常见的排序算法都是比较排序,比较排序的时间复杂度通常为 O(n^2) 或 O(nlogn) +但是如果带排序的数字有一些特俗性时,我们可以根据这来设计更加优化的排序算法。 + + + # 交换排序算法 排序算法的复杂度由 `比较的次数` 和 `交换的次数` 一起决定。 @@ -31,6 +42,8 @@ 在a【i,n】中最小的元素和 a[i]交换位置。空间复杂度O(1),时间复杂度 O(n^2) +![](./selectsort.gif) + ### 冒泡排序 @@ -40,50 +53,41 @@ 这样,即使是排好序的拿冒泡排序排序,比较的时间复杂度O(n^2) +![](./bubblesort.gif) +### 快速排序 -### 插入排序 - -1. 第一个元素算作已经排好 -2. 取下一个元素,从已经排好的序列元素中,从后向前扫描 -3. 如果排好序的元素大于 新元素,排好序的元素移到下一个位置 -4. 重复3,直到直到最后的插入位置 -5. 重复2 - -类似插入扑克牌的效果 - -最坏的情况: 待排序的是一个逆序排放的数组,这样导致每一轮都要移动元素;此时复杂度是是0(n^2) -最好的情况: 待排序的是一已经顺序排放的数字,此时只需要做一轮比较就够了 0(n)。因此可以看到,**对大部分数据已经有序这样的数组排序,使用`插入排序`非常有优势** - -空间复杂度O(1) - - -### 希尔排序 - -递减增量排序算法,对`插入排序`的改进,实质是分组插入排序,又叫`缩小增量排序` -1. 先将待排数列分割成若干子序列(增量为m) -2. 对每个子序列使用`插入排序` -3. 减小增量,再排序 -4. 对全体元素做一次`插入排序` +时间复杂度 平均复杂度 O(n * logn) , 最坏 O(n^2) +空间复杂度 +快速排序是对冒泡排序的改进,划分交换排序。 -`希尔排序`提升排序的奥秘就在于`数据元素越有序,使用插入排序效率越高` +递归一次,pivot 左边都比它小,右边都比它大。这是递归,分治的思想。 +> 快速排序就是个二叉树的前序遍历思路,归并排序就是个二叉树的后序遍历思路 -### 快速排序 +代码框架如下 -递归一次,pivot 左边都比它小,右边都比它大。这是递归,分治的思想。 +``` +void quicksort(int *a, int left, int right){ + if (left 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 对 A[p...r] : 0. 选择最后一个元素作为 pivot (基准) 1. 分解:A[p..q-1] A[q+1..r],使得 A[p...q-1]< A[q] Date: Sat, 6 Nov 2021 23:10:14 +0800 Subject: [PATCH 111/151] update readme --- ...00\347\237\255\350\267\257\345\276\204.md" | 27 +++++++++++++++++-- README.md | 16 +++++------ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git "a/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" "b/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" index 0b952ad..d933843 100644 --- "a/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" +++ "b/5 Graph/\346\234\200\347\237\255\350\267\257\345\276\204.md" @@ -1,7 +1,30 @@ -# 最短路径 +# 最短路径算法 -Dijkstra(迪杰斯特拉) +最短路径问题: 寻找图(由结点和路径组成的)中两结点之间的最短路径 + + +实现算法 + +* A* 算法 +* Floyd +* Dijkstra(迪杰斯特拉) +* bellman-ford +* spfa + + +## A* 算法 + +`A*(A-Star)`算法是一种静态路网中求解最短路径最有效的直接搜索方法; 算法中的距离估算值与实际值越接近,最终搜索速度越快。 + + + +## Dijkstra:最短路径算法 + +Dijkstra 解决图中一点到其余各点到最短路径的问题 + +Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的) + diff --git a/README.md b/README.md index 6f14128..125f83f 100644 --- a/README.md +++ b/README.md @@ -164,24 +164,22 @@ ## 15个经典基础算法 +* [KMP 字符串匹配算法](1%20String/KMP.md) * [Hash](3%20Hash%20Table/README.md) * [快速排序](6%20Sort/README.md) * 快速选择SELECT -* BFS/DFS (广度/深度优先遍历) * [红黑树 (一种弱/自平衡的`二叉查找树`)](4%20Tree/9-红黑树%20R-B%20tree/红黑树.md) -* [DP (动态规划 dynamic programming)](8%20Algorithms%20Analysis/动态规划.md) -* [KMP 字符串匹配算法](1%20String/KMP.md) -* A*寻路算法: 求解最短路径 -* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的) -* `SPFA(shortest path faster algorithm)` 单元最短路径算法 +* [BFS/DFS (广度/深度优先遍历)](5%20Graph/DFS%20和%20BFS.md) +* [`A*`寻路算法: 求解最短路径](5%20Graph/最短路径.md) +* Dijkstra:最短路径算法 +* `SPFA(Shortest Path Faster Algorithm)` 单元最短路径算法 * 启发式搜索 * 遗传算法 `GA` -* 图像特征提取之`SIFT` 算法 +* [DP (动态规划 dynamic programming)](8%20Algorithms%20Analysis/动态规划.md) +* 图像特征提取之`SIFT` 算法 , 广泛的应用于图像识别,图像检索,3D重建等CV的各种领域 * 傅立叶变换 - - ## 推荐阅读 ### 刷题必备 From 3a88447c9d3a2386dc64d11b87f8834223a69f93 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 6 Nov 2021 23:46:45 +0800 Subject: [PATCH 112/151] update readme --- 3 Hash Table/README.md | 1 + "5 Graph/DFS \345\222\214 BFS.md" | 5 +++++ "6 Sort/\345\244\226\346\216\222\345\272\217.md" | 5 +++++ .../{bloomfilter => }/Bitmap.md | 12 ++++++------ .../Bloomfilter.md | 1 - ...0\206\350\200\214\346\262\273\344\271\213.md" | 0 ...2\347\264\242\345\274\225(Inverted Index).md" | 3 +-- ...5\256\345\272\223\347\264\242\345\274\225.md" | 3 +-- 91 Algorithms In Big Data/README.md | 16 ++++++++-------- .../simhash\347\256\227\346\263\225.md" | 0 ...1\202\346\241\266\345\210\222\345\210\206.md" | 4 +--- 92 Algorithms In DB/README.md | 3 +-- 12 files changed, 29 insertions(+), 24 deletions(-) create mode 100644 "6 Sort/\345\244\226\346\216\222\345\272\217.md" rename 91 Algorithms In Big Data/{bloomfilter => }/Bitmap.md (78%) rename "91 Algorithms In Big Data/bloomfilter/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" => 91 Algorithms In Big Data/Bloomfilter.md (99%) rename "91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" => "91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" (100%) rename "91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" => "91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" (100%) diff --git a/3 Hash Table/README.md b/3 Hash Table/README.md index 409a780..0bf1d4f 100644 --- a/3 Hash Table/README.md +++ b/3 Hash Table/README.md @@ -63,6 +63,7 @@ Hash hashCode(char *key){ 当然,还有其他的散列函数,如`平方取中法`, `随机数法`等。 + ## 碰撞解决 diff --git "a/5 Graph/DFS \345\222\214 BFS.md" "b/5 Graph/DFS \345\222\214 BFS.md" index ecd990f..ed7d73c 100644 --- "a/5 Graph/DFS \345\222\214 BFS.md" +++ "b/5 Graph/DFS \345\222\214 BFS.md" @@ -1,5 +1,10 @@ # DFS 和 BFS 搜索算法 +DFS: 深度优先搜索,以深度为准则,先一条路走到底,直到达到目标; 没有达到目标又无路可走了,那么则退回到上一步的状态,走其他路。这便是回溯上来。 + +BFS:广度优先搜素,在面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路,并重复这样的操作。 + + > DFS用递归的形式,用到了栈结构,先进后出; BFS选取状态用队列的形式,先进先出。 diff --git "a/6 Sort/\345\244\226\346\216\222\345\272\217.md" "b/6 Sort/\345\244\226\346\216\222\345\272\217.md" new file mode 100644 index 0000000..6c426c6 --- /dev/null +++ "b/6 Sort/\345\244\226\346\216\222\345\272\217.md" @@ -0,0 +1,5 @@ +# 外排序 + + + + diff --git a/91 Algorithms In Big Data/bloomfilter/Bitmap.md b/91 Algorithms In Big Data/Bitmap.md similarity index 78% rename from 91 Algorithms In Big Data/bloomfilter/Bitmap.md rename to 91 Algorithms In Big Data/Bitmap.md index d2ce2d3..94ac1f4 100644 --- a/91 Algorithms In Big Data/bloomfilter/Bitmap.md +++ b/91 Algorithms In Big Data/Bitmap.md @@ -1,16 +1,16 @@ - - -## Bitmap +# Bitmap 也就是用1个(或几个)bit位来标记某个元素对应的value(如果是1bitmap,就只能是元素是否存在;如果是x-bitmap,还可以是元素出现的次数等信息)。使用bit位来存储信息,在需要的存储空间方面可以大大节省。应用场景有: -1. 排序(如果是1-bitmap,就只能对无重复的数排序) -2. 判断某个元素是否存在 +1. 判断某个元素是否存在 +2. 排序(如果是1-bitmap,就只能对无重复的数排序) + 比如,某文件中有若干8位数字的电话号码,要求统计一共有多少个不同的电话号码? -分析:8位最多99 999 999, 如果1Byte表示1个号码是否存在,需要95MB空间,但是如果1bit表示1个号码是否存在,则只需要 95/8=12MB 的空间。这时,数字k(0~99 999 999)与bit位的对应关系是: +分析:8位最多99 999 999, 如果1Byte表示1个号码是否存在,需要95MB空间,但是如果1bit表示1个号码是否存在,则只需要 95/8=12MB 的空间。这时,数字 `k(0~99 999 999)`与bit位的对应关系是: + ``` #define SIZE 15*1024*1024 diff --git "a/91 Algorithms In Big Data/bloomfilter/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" b/91 Algorithms In Big Data/Bloomfilter.md similarity index 99% rename from "91 Algorithms In Big Data/bloomfilter/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" rename to 91 Algorithms In Big Data/Bloomfilter.md index fcd6520..c0075aa 100644 --- "a/91 Algorithms In Big Data/bloomfilter/Bloom filter(\345\270\203\351\232\206\350\277\207\346\273\244\345\231\250).md" +++ b/91 Algorithms In Big Data/Bloomfilter.md @@ -1,4 +1,3 @@ - # Bloom filter(布隆过滤器) Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在海量数据处理中,一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合(容忍错误的场景)。 diff --git "a/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" "b/91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" similarity index 100% rename from "91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" rename to "91 Algorithms In Big Data/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" diff --git "a/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" "b/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" index aed743c..b203143 100644 --- "a/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" +++ "b/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" @@ -1,5 +1,4 @@ - -## 倒排索引(Inverted Index) +# 倒排索引(Inverted Index) 常规的索引是文档到关键词的映射,就是每个文档指向一个它所包含的索引项的序列,也就是文档文档指向了它包含的索引项序列,也就是文档指向它包含的哪些单词。 diff --git "a/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" "b/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" index 48048f7..96b8cf0 100644 --- "a/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" +++ "b/91 Algorithms In Big Data/Inverted Index/\346\225\260\346\215\256\345\272\223\347\264\242\345\274\225.md" @@ -1,5 +1,4 @@ - -## 数据库索引 +# 数据库索引 索引使用的数据结构多是B树或B+树。B树和B+树广泛应用于文件存储系统和数据库系统中,mysql使用的是B+树,oracle使用的是B树,Mysql也支持多种索引类型,如b-tree 索引,哈希索引,全文索引等。 diff --git a/91 Algorithms In Big Data/README.md b/91 Algorithms In Big Data/README.md index 9a34953..b45e6b5 100644 --- a/91 Algorithms In Big Data/README.md +++ b/91 Algorithms In Big Data/README.md @@ -6,15 +6,15 @@ 针对空间,就一个办法,大而化小,分而治之。常采用hash映射 -* Hash映射/分而治之 -* Bitmap -* Bloom filter(布隆过滤器) -* 双层桶划分 -* Trie树 -* 数据库索引 +* [Hash映射,分而治之](Hash映射,分而治之.md) +* [Bitmap](Bitmap.md) +* [Bloom filter(布隆过滤器)](Bloomfilter.md) +* [双层桶划分](双层桶划分.md) +* [Trie树](../4%20Tree/4-字典树Trie/README.md) +* [数据库索引](Inverted%20Index/数据库索引.md) * 倒排索引(Inverted Index) -* 外排序 -* simhash算法 +* [外排序](../6%20Sort/外排序.md) +* [simhash算法](simhash算法.md) * 分布处理之Mapreduce diff --git "a/91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" "b/91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" similarity index 100% rename from "91 Algorithms In Big Data/simhash/simhash\347\256\227\346\263\225.md" rename to "91 Algorithms In Big Data/simhash\347\256\227\346\263\225.md" diff --git "a/91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" "b/91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" index 01d77be..c4adf7d 100644 --- "a/91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" +++ "b/91 Algorithms In Big Data/\345\217\214\345\261\202\346\241\266\345\210\222\345\210\206.md" @@ -1,6 +1,4 @@ - - -## 双层桶划分 +# 双层桶划分 双层桶不是一种数据结构,只是一种算法思维。分而治之思想。 diff --git a/92 Algorithms In DB/README.md b/92 Algorithms In DB/README.md index 4095714..f818b84 100644 --- a/92 Algorithms In DB/README.md +++ b/92 Algorithms In DB/README.md @@ -1,5 +1,4 @@ - -## 数据库系统中的算法 +# 数据库系统中的算法 最近开始读《数据库系统实现》这本书,所以就想到把数据库里面用到的数据结构和算法做一个梳理。就有了这些文字。 From 00136b91f9dbb2bc78d3d866d95ed25b561668c8 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 7 Nov 2021 00:16:03 +0800 Subject: [PATCH 113/151] update readme.md --- 6 Sort/README.md | 33 +++++++++++++++++-- 8 Algorithms Analysis/README.md | 12 +++---- ...06\346\262\273\347\256\227\346\263\225.md" | 15 +++++---- ...50\346\200\201\350\247\204\345\210\222.md" | 3 +- .../\351\200\222\345\275\222.md" | 2 +- ...06\350\200\214\346\262\273\344\271\213.md" | 20 +++++++++++ 6 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 "91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" diff --git a/6 Sort/README.md b/6 Sort/README.md index 9cfae22..0e4508a 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -149,7 +149,7 @@ void quicksort(int *a, int left, int right){ ### 归并排序merge -分治算法(divide-and-conquer),必然用到递归 ; +分治算法(divide-and-conquer),必然用到递归 ; 2个有序数组的合并操作是O(n)的复杂度 因此我们可以将无序的数组,分成2个子数组分别排序,然后再merge,依次类推 @@ -161,7 +161,7 @@ void quicksort(int *a, int left, int right){ 3. 合并 -归并排序的代码框架如下: +归并排序的代码框架,套用二叉树的后续遍历思路,如下: ``` void sort(int[] nums, int lo, int hi) { @@ -174,6 +174,35 @@ void sort(int[] nums, int lo, int hi) { merge(nums, lo, mid, hi); /************************/ } + +//合并连个有序数组; 从后往前merge +public void merge(int[] arr,int low,int mid,int high,int[] tmp){ + int i = 0; + int j = low,k = mid+1; //左边序列和右边序列起始索引 + + while(j <= mid && k <= high){ + if(arr[j] < arr[k]){ + tmp[i++] = arr[j++]; + }else{ + tmp[i++] = arr[k++]; + } + } + + //若左边序列还有剩余,则将其全部拷贝进tmp[]中 + while(j <= mid){ + tmp[i++] = arr[j++]; + } + + while(k <= high){ + tmp[i++] = arr[k++]; + } + + for(int t=0;t 自顶向下的递归,自底向上是迭代 diff --git "a/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" "b/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" new file mode 100644 index 0000000..a964710 --- /dev/null +++ "b/91 Algorithms In Big Data/mapreduce/Hash\346\230\240\345\260\204,\345\210\206\350\200\214\346\262\273\344\271\213.md" @@ -0,0 +1,20 @@ +# Hash映射,分而治之 + +这里的`Hash映射`是指通过一种映射散列的方式,将海量数据均匀分布在对应的内存或更小的文件中 + +使用hash映射有个最重要的特点是: `hash值相同的两个串不一定一样,但是两个一样的字符串hash值一定相等`。哈希函数如下: + +``` +int hash = 0; +for (int i=0;i Date: Sun, 7 Nov 2021 01:15:35 +0800 Subject: [PATCH 114/151] update readme --- 2 List/README.md | 10 ++++- "4 Tree/8-\345\240\206/\345\240\206.md" | 42 ++++++++++++++++++++ 4 Tree/README.md | 4 ++ 5 Graph/README.md | 9 ++++- 6 Sort/README.md | 33 +++------------- 9 Algorithms Job Interview/README.md | 52 +++++++++++++++++++++++-- README.md | 2 + 7 files changed, 118 insertions(+), 34 deletions(-) diff --git a/2 List/README.md b/2 List/README.md index 1e0460f..a8a29af 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -25,11 +25,19 @@ java 中扩容,每次扩容新增原先容量的 1/2 ### 链表 VS 数组 +特点 -* 查询: 数组 O(1), 内存连续, 有序时可以用二分查找;有界 +* 数组 : 内存连续, 更好利用局部性原理;内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,有界 +* 链表 : 不存在数组的扩容问题, 空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问; 需要前后元素位置的指针,会消耗相对更多的储存空间 + +优缺点: + +* 查询: 数组 O(1), 有序时可以用二分查找; * 删除: 链表只需要移动指针 O(1) ,数组的话删除元素需要移动后续的元素 O(N) + + ## 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 diff --git "a/4 Tree/8-\345\240\206/\345\240\206.md" "b/4 Tree/8-\345\240\206/\345\240\206.md" index 16bb213..73f9773 100644 --- "a/4 Tree/8-\345\240\206/\345\240\206.md" +++ "b/4 Tree/8-\345\240\206/\345\240\206.md" @@ -1,5 +1,47 @@ # 大顶堆 和 小顶堆 +先来了解下 `堆` 结构; 堆也被称为`优先队列` ; + +特点 + +* 堆总是一颗完全二叉树树, 使用数组作为其存储结构; +* 任一节点小于(或大于)其所有的孩子节点; + + +堆分小根堆和大根堆; 如果是大于所有孩子节点,这就是一颗大根堆,也就是根节点是堆上的最大值;如果节点小于所有的子节点,这就是一颗小跟堆,也即是根节点是堆上所有节点的最小值。 + + + +### 应用场景 + +* 优先队列 如iOS中的NSOperationQueue 就是维护一个优先队列 +* 堆排序 +* top-K 大(小) + + + +# 堆存储结构 + + +`堆用数组来存储`,因为是一颗完全二叉树,i节点的父节点索引就是(i-1)/2, 左右子节点小标是 2i+1,2i+2。 + +堆的操作有: + +* 建堆 +* 插入:都是插入到数组最后,然后再调整满足堆次序 +* 删除:删除总是发生在 A[0]处,也就是只删除根节点 + +这样难怪`堆`被称为 `优先队列`。 插入和删除分别在 数组尾部和头部,只是需要再次调整以满足堆次序。 + + + + + + + + + + diff --git a/4 Tree/README.md b/4 Tree/README.md index 1b16e27..b163486 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -16,6 +16,10 @@ * 赫夫曼编码 Huffman +## 二叉树 + + + ## [二叉查找树](2-二叉查找树/二叉查找树.md) 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 diff --git a/5 Graph/README.md b/5 Graph/README.md index a4d7452..0774d79 100644 --- a/5 Graph/README.md +++ b/5 Graph/README.md @@ -37,10 +37,17 @@ # 图的存储结构 * 对象和指针 -* 矩阵 +* 邻接矩阵 (二维数组) * 邻接表 +图数据结构表示: + +``` + +``` + + ## 图的操作 #### 遍历 diff --git a/6 Sort/README.md b/6 Sort/README.md index 0e4508a..20636e4 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -246,40 +246,17 @@ public void merge(int[] arr,int low,int mid,int high,int[] tmp){ 利用堆这种数据结构设计的一种排序算法 -先来了解下 `堆` 结构 - -堆分小根堆和大根堆 - -堆: 任一节点小于(或大于)其所有的孩子节点,如果是大于所有孩子节点,这就是一颗大根堆,也就是根节点是堆上的最大值;如果节点小于所有的子节点,这就是一颗小跟堆,也即是根节点是堆上所有节点的最小值。 - -堆也被称为`优先队列` -堆总是一颗完全树 - -`堆用数组来存储`,i节点的父节点就是(i-1)/2,左右子节点小标是 2i+1,2i+2。 - -堆的操作有: - -建堆 -插入:都是插入到数组最后,然后再调整满足堆次序 -删除:删除总是发生在 A[0]处,也就是只删除根节点 - -这样难怪`堆`被称为 `优先队列`。插入和删除分别在 数组尾部和头部,只是需要再次调整以满足堆次序。 - -`堆`的应用场景有: -优先队列 如iOS中的NSOperationQueue 就是维护一个优先队列 -堆排序 - - +[堆结构参考这里](../4%20Tree/8-堆/堆.md) 我们来看看如何使用`堆` 来做排序? -1.将待排序数列看做一颗完全二叉树的存储结构 -2.`堆化数组`,结束后,根a[0]变成了最小的值(小根堆) -3.取a[0]值,然后对`堆`做删除操作,此时,`堆`会重新 `堆化数组`,a[0]又是下一个最小的值。 +1. 将待排序数列看做一颗完全二叉树的存储结构 +2. `堆化数组`,结束后,根a[0]变成了最小的值(小根堆) +3. 取a[0]值,然后对`堆`做删除操作,此时,`堆`会重新 `堆化数组`,a[0]又是下一个最小的值。 删除操作通常是先把数组最后的元素提到a[0]位置,然后从根节点开始进行一次从上向下的调整;调整时,先从左右孩子中找最小的交换。如果父节点比每个节点都小就不用调整。(因此,在`堆排序`是可以直接让 a[0]和数组最后一个元素互换,但要先保存好a[0],或者a[n-1],这样导致了使用`堆排序`时,递增排序使用大根堆,递减排序使用小根堆。) 4. 循环3,就可以按从小到大的顺序取出所有数组元素。 -堆排序主要时间花在建堆期间和`堆化数组`,找数列中最大树只需要O(1)时间复杂度 +堆排序主要时间花在建堆期间和`堆化数组`,找数列中最大数只需要O(1)时间复杂度 void heap_sort(int *a, int length){ diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index 08a9ad1..c39960f 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -79,20 +79,64 @@ +# 刷题框架套路 +遍历 -## [《剑指offer》](剑指offer/README.md) +``` +# 数组遍历框架 +void traverse(int[] arr) { + for (int i = 0; i < arr.length; i++) { + // 迭代访问 arr[i] + } +} -《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 +# 链表遍历框架 +void traverse(ListNode head) { + for (ListNode p = head; p != null; p = p.next) { + // 迭代访问 p.val + } +} +``` -## [《编程之美》](编程之美/README.md) +递归 +``` +# 链表递归 +void traverse(ListNode head) { + // 递归访问 head.val + traverse(head.next); +} + + +# 二叉树递归 +void traverse(TreeNode root) { + traverse(root.left); + traverse(root.right); +} + +# 多叉树递归 +void traverse(TreeNode root) { + for (TreeNode child : root.children) + traverse(child); +} + +# 图的递归:,用个布尔数组 visited 做标记就行了 + + +``` + + + +# 参考 [九度OJ](http://ac.jobdu.com/index.php) [leetcode 题目](https://leetcode.com/) - +[labuladong 的算法小抄](https://labuladong.gitee.io/algo/1/2/) +[《剑指offer》](剑指offer/README.md) 《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 +[《编程之美》](编程之美/README.md) diff --git a/README.md b/README.md index 125f83f..ebc3c05 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ * 链表 * 双向链表 +数组和链表结构是基础结构,散列表、栈、队列、堆、树、图等等各种数据结构都基于数组和链表结构实现。 + ### [队列](2%20Queue/README.md) * 队列 From 881539862f84da7d8df35580d0f23c87722a2863 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 7 Nov 2021 13:28:51 +0800 Subject: [PATCH 115/151] update tree --- ...5\217\211\346\237\245\346\211\276\346\240\221.md" | 2 +- .../\344\274\270\345\261\225\346\240\221.md" | 3 +-- ...5\217\215\345\220\221\347\264\242\345\274\225.md" | 12 ------------ ...5\244\253\346\233\274\347\274\226\347\240\201.md" | 4 ++-- ...5\212\250\346\200\201\350\247\204\345\210\222.md" | 4 +++- ...6\222\347\264\242\345\274\225(Inverted Index).md" | 9 +++++++++ 6 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 "4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" diff --git "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" index 965a982..0a47375 100644 --- "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" +++ "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" @@ -1,4 +1,4 @@ -# 二叉查找树 +# 二叉查找树BST 二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。是指一个空树或者具有下列性质的二叉树: diff --git "a/4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" "b/4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" index 1a9e070..eaa5d51 100644 --- "a/4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" +++ "b/4 Tree/5-\344\274\270\345\261\225\346\240\221/\344\274\270\345\261\225\346\240\221.md" @@ -1,5 +1,4 @@ - -## 伸展树 (splay tree) +# 伸展树 (splay tree) 伸展树是一种自平衡的二叉排序树。为什么需要这些自平衡的二叉排序树? diff --git "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" "b/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" deleted file mode 100644 index bcb9b23..0000000 --- "a/4 Tree/91-\345\217\215\345\220\221\347\264\242\345\274\225/\345\217\215\345\220\221\347\264\242\345\274\225.md" +++ /dev/null @@ -1,12 +0,0 @@ -# 反向索引 - -正排索引如 mysql中的索引实现 ,通常使用 B+ 树实现。 反向索引如何来实现呢? - -### 应用场景 - -* ES -* 推荐内容召回 - - - - diff --git "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" index 8e641a6..274e410 100644 --- "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" +++ "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" @@ -1,5 +1,4 @@ - -## 赫夫曼编码 Huffman +# 赫夫曼编码 Huffman 这是一个经典的压缩算法。通过`字符出现的频率`,`优先级`,`二叉树`进行的压缩算法。 @@ -42,6 +41,7 @@ struct node{ 被编码的文本长度 unsigned int size 字符频率表 unsigned char freqs[NUM_CHARS] + ###解压缩 1. 读取文件头 diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 21fb2f1..e5797cf 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -29,6 +29,8 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 * 接雨水问题 * Fibonacci数列 * 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 +* 二叉树的最近公共祖先 +* 链表翻转 ``` @@ -57,7 +59,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 ## DP 解题模板 -#### 基本步骤 +基本步骤 * 划分问题 * 状态 diff --git "a/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" "b/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" index b203143..3c83445 100644 --- "a/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" +++ "b/91 Algorithms In Big Data/Inverted Index/\345\200\222\346\216\222\347\264\242\345\274\225(Inverted Index).md" @@ -34,6 +34,15 @@ T2 = "it is a banana" - 在加入新文章时,我们需要为新文章中的关键词索引和之前的合并 +### 应用场景 + +* mysql中的索引实现,使用 B+ 树实现 +* ES +* 推荐内容召回 + + + + ### 参考 From 103347ed161d23b0c34654734f01b1ca9b75ec3f Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 9 Nov 2021 01:26:42 +0800 Subject: [PATCH 116/151] update tree --- .../README.md" | 10 ++++++---- ...5\244\253\346\233\274\347\274\226\347\240\201.md" | 4 +++- ...5\212\250\346\200\201\350\247\204\345\210\222.md" | 5 +++++ .../\345\233\236\346\272\257\346\263\225.md" | 12 ++++++++---- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" index cda44ef..6968f78 100644 --- "a/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" +++ "b/4 Tree/4-\345\255\227\345\205\270\346\240\221Trie/README.md" @@ -1,6 +1,5 @@ # 字典树trie -## trie基本 `字典树`,英文名`Trie树`,Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”, 又称`单词查找树` 或 `前缀树`,Trie树,是一种树形结构(多叉树)。 @@ -81,9 +80,12 @@ trie树把每个关键字保存在一条路径上,而不是一个节点中 ## trie树存储结构和基本操作 -最简单实现 ---- 26个字母表 a-z (没有考虑数字,大小写,其他字符如=-*/) -子树用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存 -如果用链表存储,查询时需要遍历链表,查询效率有所降低 +最简单实现 ---- 26个字母表 `a-z` (没有考虑数字,大小写,其他字符如 `=-*/`) + +trie 树存储结构 + +* 用数组存储,浪费空间;如果系统中存在大量字符串,且这些字符串基本没有公共前缀,trie树将消耗大量内存 +* 用链表存储,查询时需要遍历链表,查询效率有所降低 diff --git "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" index 274e410..624b6a5 100644 --- "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" +++ "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" @@ -1,6 +1,8 @@ # 赫夫曼编码 Huffman -这是一个经典的压缩算法。通过`字符出现的频率`,`优先级`,`二叉树`进行的压缩算法。 +Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的这种编码思想提出了一种不定长编码的方法,也称霍夫曼(Huffman)编码。 + +这是一个经典的压缩算法。通过`字符出现的频率`,`优先级`,`二叉树` 进行的压缩算法。 对一个字符串,计算每个字符出现的次数,把这些字符放到优先队列(priority queue) 这这个priority queue转出二叉树 diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index e5797cf..b7d41f0 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -55,6 +55,11 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。 +### DP VS 回溯法 + + +动态规划的暴力求解阶段就是回溯算法。只是有的问题具有重叠子问题性质,可以用 dp table 或者备忘录优化,将递归树大幅剪枝,这就变成了动态规划;而有些问题没有重叠子问题,也就是[回溯算法](回溯法.md)问题了,复杂度非常高是不可避免的 + ## DP 解题模板 diff --git "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" index 9599935..f4a12fd 100644 --- "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" @@ -13,6 +13,14 @@ 回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。 +#### 案例 + +* 迷宫问题 +* 全排列 + + + + ## 代码框架 ``` @@ -48,9 +56,5 @@ def backtrack(路径, 选择列表): -#### 其它案例 - -* 迷宫问题 -* 全排列 From 1023845d74a518ec84a22ade5279f53aa0f4f5a7 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 9 Nov 2021 14:21:46 +0800 Subject: [PATCH 117/151] top-k --- .../Top-K \351\227\256\351\242\230.md" | 20 +++++ "4 Tree/8-\345\240\206/\345\240\206.md" | 80 +++++++++++++++++-- .../\345\233\236\346\272\257\346\263\225.md" | 2 +- 3 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 "4 Tree/8-\345\240\206/Top-K \351\227\256\351\242\230.md" diff --git "a/4 Tree/8-\345\240\206/Top-K \351\227\256\351\242\230.md" "b/4 Tree/8-\345\240\206/Top-K \351\227\256\351\242\230.md" new file mode 100644 index 0000000..326ca38 --- /dev/null +++ "b/4 Tree/8-\345\240\206/Top-K \351\227\256\351\242\230.md" @@ -0,0 +1,20 @@ +# Top-K 问题 + + +问题描述:从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题 + + +思路 + +1. 排序,全局都排序了,这也是这个方法复杂度非常高的原因 ; [排序算法参考这里](../../6%20Sort/REAME.md) +2. 冒泡排序,局部排序徐,只对最大的k个数排序 +3. [堆排序](./堆.md), 只找最大的k个数,这k个数不需要排序; top-k大 问题就是用 小根堆, 小根堆 固定为 k 个元素大小 , 遍历 k-N (N为所有数据的个数),插入小根堆并调整堆,以保证堆内的k个元素,总是当前最大的k个元素。 + + + + + + + + + diff --git "a/4 Tree/8-\345\240\206/\345\240\206.md" "b/4 Tree/8-\345\240\206/\345\240\206.md" index 73f9773..8877e6f 100644 --- "a/4 Tree/8-\345\240\206/\345\240\206.md" +++ "b/4 Tree/8-\345\240\206/\345\240\206.md" @@ -1,40 +1,106 @@ # 大顶堆 和 小顶堆 -先来了解下 `堆` 结构; 堆也被称为`优先队列` ; +先来了解下 `堆` 结构; 堆也被称为`优先队列`,`二叉堆` ; 特点 -* 堆总是一颗完全二叉树树, 使用数组作为其存储结构; +* 堆总是一颗完全二叉树树, 使用数组作为其存储结构,因此也叫 `二叉堆`; 用链表存的就叫二叉树了 * 任一节点小于(或大于)其所有的孩子节点; -堆分小根堆和大根堆; 如果是大于所有孩子节点,这就是一颗大根堆,也就是根节点是堆上的最大值;如果节点小于所有的子节点,这就是一颗小跟堆,也即是根节点是堆上所有节点的最小值。 +堆分小根堆和大根堆; 如果根节点大于所有孩子节点,这就是一颗大根堆,也就是根节点是堆上的最大值;如果节点小于所有的子节点,这就是一颗小跟堆,也即是根节点是堆上所有节点的最小值。 +`堆用数组来存储`,因为是一颗完全二叉树,i节点的父节点索引就是(i-1)/2, 左右子节点小标是 2i+1,2i+2。 + +比如大根堆存储示例 + +``` +10, 7, 6 , 3, 4, 1, 5 +``` ### 应用场景 -* 优先队列 如iOS中的NSOperationQueue 就是维护一个优先队列 +* 优先队列 如iOS中的 NSOperationQueue 就是维护一个优先队列 * 堆排序 -* top-K 大(小) +* top-K 大(小) , top-k大 问题就是用 小根堆, 小根堆 固定为 k 个元素大小 , 遍历 k-N (N为所有数据的个数),插入小根堆并调整堆,以保证堆内的k个元素,总是当前最大的k个元素。 # 堆存储结构 -`堆用数组来存储`,因为是一颗完全二叉树,i节点的父节点索引就是(i-1)/2, 左右子节点小标是 2i+1,2i+2。 - 堆的操作有: * 建堆 * 插入:都是插入到数组最后,然后再调整满足堆次序 * 删除:删除总是发生在 A[0]处,也就是只删除根节点 + 这样难怪`堆`被称为 `优先队列`。 插入和删除分别在 数组尾部和头部,只是需要再次调整以满足堆次序。 +优先级队列的代码实现 + + +```java +public class MaxPQ + > { + // 存储元素的数组 + private Key[] pq; + // 当前 Priority Queue 中的元素个数 + private int N = 0; + + public MaxPQ(int cap) { + // 索引 0 不用,所以多分配一个空间 + pq = (Key[]) new Comparable[cap + 1]; + } + + /* 返回当前队列中最大元素 */ + public Key max() { + return pq[1]; + } + + /* 插入元素 e */ + public void insert(Key e) {...} + + /* 删除并返回当前队列中最大元素 */ + public Key delMax() {...} + + /* 上浮第 k 个元素,以维护最大堆性质 */ + private void swim(int k) {...} + + /* 下沉第 k 个元素,以维护最大堆性质 */ + private void sink(int k) {...} + + /* 交换数组的两个元素 */ + private void exch(int i, int j) { + Key temp = pq[i]; + pq[i] = pq[j]; + pq[j] = temp; + } + + /* pq[i] 是否比 pq[j] 小? */ + private boolean less(int i, int j) { + return pq[i].compareTo(pq[j]) < 0; + } + + /* 还有 left, right, parent 三个方法 */ +} + +``` + + + + + + + + + + + diff --git "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" index f4a12fd..9275b8a 100644 --- "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" @@ -23,7 +23,7 @@ ## 代码框架 -``` +```python result = [] def backtrack(路径, 选择列表): if 满足结束条件: From 990a0b3da50b92ccd447b1f94f1100c192014d0a Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 9 Nov 2021 14:25:36 +0800 Subject: [PATCH 118/151] update sort --- 6 Sort/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/6 Sort/README.md b/6 Sort/README.md index 20636e4..c598f11 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -252,10 +252,10 @@ public void merge(int[] arr,int low,int mid,int high,int[] tmp){ 1. 将待排序数列看做一颗完全二叉树的存储结构 2. `堆化数组`,结束后,根a[0]变成了最小的值(小根堆) -3. 取a[0]值,然后对`堆`做删除操作,此时,`堆`会重新 `堆化数组`,a[0]又是下一个最小的值。 -删除操作通常是先把数组最后的元素提到a[0]位置,然后从根节点开始进行一次从上向下的调整;调整时,先从左右孩子中找最小的交换。如果父节点比每个节点都小就不用调整。(因此,在`堆排序`是可以直接让 a[0]和数组最后一个元素互换,但要先保存好a[0],或者a[n-1],这样导致了使用`堆排序`时,递增排序使用大根堆,递减排序使用小根堆。) +3. 取a[0]值,然后对`堆`做删除操作,此时,`堆`会重新 `堆化数组`,a[0]又是下一个最小的值。删除操作通常是先把数组最后的元素提到a[0]位置,然后从根节点开始进行一次从上向下的调整;调整时,先从左右孩子中找最小的交换。如果父节点比每个节点都小就不用调整。因此,在`堆排序`是可以直接让 a[0]和数组最后一个元素互换,但要先保存好a[0],或者a[n-1],这样导致了使用`堆排序`时,递增排序使用大根堆,递减排序使用小根堆。 4. 循环3,就可以按从小到大的顺序取出所有数组元素。 + 堆排序主要时间花在建堆期间和`堆化数组`,找数列中最大数只需要O(1)时间复杂度 From 5e159f210b87fb3d963683bdc7590d0d7feaf873 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 9 Nov 2021 14:48:48 +0800 Subject: [PATCH 119/151] update heap --- "4 Tree/8-\345\240\206/\345\240\206.md" | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git "a/4 Tree/8-\345\240\206/\345\240\206.md" "b/4 Tree/8-\345\240\206/\345\240\206.md" index 8877e6f..114c01e 100644 --- "a/4 Tree/8-\345\240\206/\345\240\206.md" +++ "b/4 Tree/8-\345\240\206/\345\240\206.md" @@ -41,6 +41,14 @@ 这样难怪`堆`被称为 `优先队列`。 插入和删除分别在 数组尾部和头部,只是需要再次调整以满足堆次序。 +### 堆调整 + +插入或删除元素以后, 如何进行堆调整, 已满足堆次序? + + + + + 优先级队列的代码实现 From b3672ec2f0887961cd69ce90327c44204e836357 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 9 Nov 2021 14:55:28 +0800 Subject: [PATCH 120/151] update 9 --- .../\345\220\216\347\274\200\346\240\221.md" | 3 +-- "4 Tree/8-\345\240\206/\345\240\206.md" | 2 +- 9 Algorithms Job Interview/README.md | 8 ++++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git "a/4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" "b/4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" index 47e8368..43c5a72 100644 --- "a/4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" +++ "b/4 Tree/6-\345\220\216\347\274\200\346\240\221/\345\220\216\347\274\200\346\240\221.md" @@ -1,5 +1,4 @@ - -## 后缀树(suffix tree) +# 后缀树(suffix tree) ###后缀树的应用 diff --git "a/4 Tree/8-\345\240\206/\345\240\206.md" "b/4 Tree/8-\345\240\206/\345\240\206.md" index 114c01e..74111ad 100644 --- "a/4 Tree/8-\345\240\206/\345\240\206.md" +++ "b/4 Tree/8-\345\240\206/\345\240\206.md" @@ -24,7 +24,7 @@ * 优先队列 如iOS中的 NSOperationQueue 就是维护一个优先队列 * 堆排序 -* top-K 大(小) , top-k大 问题就是用 小根堆, 小根堆 固定为 k 个元素大小 , 遍历 k-N (N为所有数据的个数),插入小根堆并调整堆,以保证堆内的k个元素,总是当前最大的k个元素。 +* [top-K 大(小)](Top-K%20问题.md) , top-k大 问题就是用 小根堆, 小根堆 固定为 k 个元素大小 , 遍历 k-N (N为所有数据的个数),插入小根堆并调整堆,以保证堆内的k个元素,总是当前最大的k个元素。 diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index c39960f..fee673c 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -2,6 +2,12 @@ 这部分内容是算法问题合集,题目大多来自网络和书籍。我做了下简单的整理,很多题做了一些思路标记。 +常用解题套路工具 + +* 数组,字符串问题:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。 +* 二叉树问题:递归 +* [动态规划问题](../8%20Algorithms%20Analysis/动态规划.md) + ## [字符串](1%20字符串.md) @@ -14,8 +20,6 @@ * 字符串比较 * 子串 - -数组,字符串问题常用解题套路:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。 ## [链表](2%20链表.md) From a45c4567591780d31e90cda2190f8b78adb258a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Wed, 10 Nov 2021 09:53:44 +0800 Subject: [PATCH 121/151] =?UTF-8?q?Update=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "8 Algorithms Analysis/\351\200\222\345\275\222.md" | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 2b3f933..f751283 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -1,6 +1,8 @@ # 递归 -递归是一种设计和描述算法的有力工具。 递归算法执行过程分 `递推` 和 `回归` 两个阶段 +递归是一种设计和描述算法的有力工具。 也是回溯法和动态规划的基础。 + +递归算法执行过程分 `递推` 和 `回归` 两个阶段 在 `递推` 阶段,将大的问题分解成小的问题 在 `回归` 阶段,获得最简单问题的解后,逐级返回,依次得到稍微复杂情况的解,知道获得最终的结果 @@ -13,6 +15,9 @@ 递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 +画递归树,可以很方便地看到是否存在重叠子问题,如果有的话,就可以采用动态规划。 + + ### 其它案例 From af658eb2e67bfe66f96c09b3f96c264a3b9073c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Wed, 10 Nov 2021 09:55:22 +0800 Subject: [PATCH 122/151] =?UTF-8?q?Update=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "8 Algorithms Analysis/\351\200\222\345\275\222.md" | 3 +++ 1 file changed, 3 insertions(+) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index f751283..3a8cd69 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -15,6 +15,9 @@ 递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 + +### 递归树 + 画递归树,可以很方便地看到是否存在重叠子问题,如果有的话,就可以采用动态规划。 From 9ce6414f7bcf02ac2f5b671e1c6db868ee471860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Wed, 10 Nov 2021 09:57:16 +0800 Subject: [PATCH 123/151] =?UTF-8?q?Update=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "8 Algorithms Analysis/\351\200\222\345\275\222.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 3a8cd69..04e9ca1 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -15,6 +15,18 @@ 递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 +### 递归公式 + +快排 + +归并排 + + +二叉树 + + + + ### 递归树 From 5a0d23faa858ca7259dc5d17dcda80e328b32894 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 10 Nov 2021 14:27:03 +0800 Subject: [PATCH 124/151] update dp --- 3 Hash Table/LinkedHashMap.md | 58 +++++++++++++++++++ ...50\346\200\201\350\247\204\345\210\222.md" | 1 + .../\345\233\236\346\272\257\346\263\225.md" | 28 ++++++++- .../\351\200\222\345\275\222.md" | 2 +- 4 files changed, 87 insertions(+), 2 deletions(-) diff --git a/3 Hash Table/LinkedHashMap.md b/3 Hash Table/LinkedHashMap.md index 515225a..4a3db88 100644 --- a/3 Hash Table/LinkedHashMap.md +++ b/3 Hash Table/LinkedHashMap.md @@ -100,6 +100,64 @@ protected boolean removeEldestEntry(Map.Entry eldest) { ``` +基于 LinkedHashMap实现的 LRU Cache + + +```Java +class LRUCache { + int cap; + LinkedHashMap cache = new LinkedHashMap<>(); + public LRUCache(int capacity) { + this.cap = capacity; + } + + //访问元素 + public int get(int key) { + if (!cache.containsKey(key)) { + return -1; + } + // 将 key 变为最近使用 + makeRecently(key); + return cache.get(key); + } + + //添加元素到cache + public void put(int key, int val) { + if (cache.containsKey(key)) { + // 修改 key 的值 + cache.put(key, val); + // 将 key 变为最近使用 + makeRecently(key); + return; + } + + if (cache.size() >= this.cap) { + // 链表头部就是最久未使用的 key + int oldestKey = cache.keySet().iterator().next(); + cache.remove(oldestKey); + } + // 将新的 key 添加链表尾部 + cache.put(key, val); + } + + private void makeRecently(int key) { + int val = cache.get(key); + // 删除 key,重新插入到队尾 + cache.remove(key); + cache.put(key, val); + } +} + +``` + + + + + + + + + diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index b7d41f0..01a2222 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -57,6 +57,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 ### DP VS 回溯法 +DP 和 回溯法 都会用到递归 动态规划的暴力求解阶段就是回溯算法。只是有的问题具有重叠子问题性质,可以用 dp table 或者备忘录优化,将递归树大幅剪枝,这就变成了动态规划;而有些问题没有重叠子问题,也就是[回溯算法](回溯法.md)问题了,复杂度非常高是不可避免的 diff --git "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" index 9275b8a..1a7fd91 100644 --- "a/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\233\236\346\272\257\346\263\225.md" @@ -20,7 +20,6 @@ - ## 代码框架 ```python @@ -43,6 +42,33 @@ def backtrack(路径, 选择列表): > n 个不重复的数,全排列共有 n! 个 +```Java + // 路径:记录在 track 中 + // 选择列表:nums 中不存在于 track 的那些元素 + // 结束条件:nums 中的元素全都在 track 中出现 + void backtrack(int[] nums, LinkedList track) { + // 触发结束条件 + if (track.size() == nums.length) { + res.add(new LinkedList(track)); + return; + } + + for (int i = 0; i < nums.length; i++) { + // 排除不合法的选择 + if (track.contains(nums[i])) + continue; + + // 做选择 + track.add(nums[i]); + + // 进入下一层决策树 + backtrack(nums, track); + // 取消选择 + track.removeLast(); + } + } +``` + ## 八皇后问题 diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 2b3f933..0d36733 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -6,7 +6,7 @@ 在 `回归` 阶段,获得最简单问题的解后,逐级返回,依次得到稍微复杂情况的解,知道获得最终的结果 1) 确定递归公式 , 比如 斐波那契数列 问题中的 `fib(n)=fib(n-1)+fib(n-2)` -2) 确定边界条件 +2) 确定边界条件 bad case > 自顶向下的递归,自底向上是迭代 From 0b2ae012d04a56ac2c7a82314f107944d87901da Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 10 Nov 2021 16:27:32 +0800 Subject: [PATCH 125/151] update recursion --- .../\351\200\222\345\275\222.md" | 38 ++++++++++++++++++- ...7 \344\272\214\345\217\211\346\240\221.md" | 15 ++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 112256d..94f9d3f 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -17,14 +17,50 @@ ### 递归公式 -快排 +[快排](../6%20Sort/README.md) + +```Java + void quicksort(int *a, int left, int right){ + if (left Date: Wed, 10 Nov 2021 16:35:20 +0800 Subject: [PATCH 126/151] update readme --- 1 String/java String.md | 4 ---- 4 Tree/README.md | 5 +++-- 8 Algorithms Analysis/README.md | 8 +------- .../\345\210\206\346\262\273\347\256\227\346\263\225.md" | 2 +- 9 Algorithms Job Interview/README.md | 2 +- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/1 String/java String.md b/1 String/java String.md index a837aad..bcf2e29 100644 --- a/1 String/java String.md +++ b/1 String/java String.md @@ -3,7 +3,3 @@ Java 中 String 实现。 -``` - -``` - diff --git a/4 Tree/README.md b/4 Tree/README.md index b163486..6b16a06 100644 --- a/4 Tree/README.md +++ b/4 Tree/README.md @@ -19,11 +19,12 @@ ## 二叉树 +[快速排序](../6%20Sort/README.md)就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 -## [二叉查找树](2-二叉查找树/二叉查找树.md) -快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 +## [二叉查找树BST](2-二叉查找树/二叉查找树.md) +有序的二叉树,中序遍历结果是递增的 ## [AVL树](3-平衡树AVL/README.md) diff --git a/8 Algorithms Analysis/README.md b/8 Algorithms Analysis/README.md index 4678500..007526c 100644 --- a/8 Algorithms Analysis/README.md +++ b/8 Algorithms Analysis/README.md @@ -16,13 +16,7 @@ ### 总结 -贪心法、分治法、动态规划都是将问题归纳为根小的、相似的子问题,通过求解子问题产生全局最优解。 - -`贪心法` - -`分治法` - -`动态规划` +`贪心法`、`分治法`、`动态规划` 都是将问题归纳为根小的、相似的子问题,通过求解子问题产生全局最优解。 diff --git "a/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" index 3e6328e..be1eb73 100644 --- "a/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" +++ "b/8 Algorithms Analysis/\345\210\206\346\262\273\347\256\227\346\263\225.md" @@ -3,7 +3,7 @@ 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,各个击破,分而治之。 -分治算法常用`递归`实现 +分治算法常用[递归](./递归.md) 实现 1)问题缩小的小规模可以很容易解决 2)问题可以分解为规模较小相同问题 diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index fee673c..bef2121 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -79,7 +79,7 @@ -## 智力思维训练 +## [智力思维训练](9%20智力思维训练.md) From e819afafb996a0bb5a66ef86fb440521b59bf1ec Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 10 Nov 2021 16:50:22 +0800 Subject: [PATCH 127/151] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ebc3c05..1304c07 100644 --- a/README.md +++ b/README.md @@ -255,7 +255,7 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html [OI Wiki](https://github.com/24OI/OI-wiki/) 主要内容是 OI / ACM-ICPC 相关的知识整理。 - +[labuladong 的算法小抄](https://labuladong.gitee.io/algo/) 作者整理了很多的解题套路框架,看完获益良多 ## 联系 From 3b1001135d67314649a6c22586ca7eb8ccf41506 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 10 Nov 2021 17:05:04 +0800 Subject: [PATCH 128/151] update readme --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1304c07..c21d73b 100644 --- a/README.md +++ b/README.md @@ -246,14 +246,18 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html * [九度OJ](http://ac.jobdu.com/index.php) * 这有个[ACM训练方案](http://www.java3z.com/cwbwebhome/article/article19/res041.html) -### 其它 + +### 网课 [高级数据结构和算法](https://www.coursera.org/learn/gaoji-shuju-jiegou/) 北大教授张铭老师在coursera上的课程。完成这门课之时,你将掌握多维数组、广义表、Trie树、AVL树、伸展树等高级数据结构,并结合内排序、外排序、检索、索引有关的算法,高效地解决现实生活中一些比较复杂的应用问题。当然coursera上也还有很多其它算法方面的视频课程。 [算法设计与分析 Design and Analysis of Algorithms](https://class.coursera.org/algorithms-001/lecture) 由北大教授Wanling Qu在coursera讲授的一门算法课程。首先介绍一些与算法有关的基础知识,然后阐述经典的算法设计思想和分析技术,主要涉及的算法设计技术是:分治策略、动态规划、贪心法、回溯与分支限界等。每个视频都配有相应的讲义(pdf文件)以便阅读和复习。 -[OI Wiki](https://github.com/24OI/OI-wiki/) 主要内容是 OI / ACM-ICPC 相关的知识整理。 + +### 其它 + +[OI Wiki](https://github.com/24OI/OI-wiki/) 主要内容是 OI/ACM-ICPC 编程竞赛 (competitive programming) 相关的知识整理, 包括基础知识、常见题型、解题思路以及常用工具等内容。 [labuladong 的算法小抄](https://labuladong.gitee.io/algo/) 作者整理了很多的解题套路框架,看完获益良多 From c6f0c16806ffe79935acc2b0464775cdd219d69a Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 10 Nov 2021 17:07:31 +0800 Subject: [PATCH 129/151] add topcode --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c21d73b..e3d6f0f 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,8 @@ http://www.cs.usfca.edu/~galles/visualization/Algorithms.html ### 编程网站 -* [leetcode](http://leetcode.com/) +* [leetcode](http://leetcode.com/) +* [codetop](https://codetop.cc/home) 企业高频面试题库,刷题必备 * [openjudge](http://openjudge.cn/) 开放在线程序评测平台,可以创建自己的OJ小组   * [九度OJ](http://ac.jobdu.com/index.php) * 这有个[ACM训练方案](http://www.java3z.com/cwbwebhome/article/article19/res041.html) From 99ca1198c0dff38da5074cbee1584aa3fad97eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Thu, 11 Nov 2021 10:06:07 +0800 Subject: [PATCH 130/151] Update README.md --- 9 Algorithms Job Interview/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index bef2121..b7bb001 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -2,6 +2,15 @@ 这部分内容是算法问题合集,题目大多来自网络和书籍。我做了下简单的整理,很多题做了一些思路标记。 +如何更好的写算法题 + +ide 工具 & 文本框 +语言基础语法:各常用集合的api,要能够默写 +题型,熟悉各种题目,避免在题目理解上花太多时间跟面试官拉齐 +编程思路和框架,拿到题目以后能快速套思路和代码框架 +编程细节:多练习,总结 + + 常用解题套路工具 * 数组,字符串问题:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。 From 892359e28b46ac1e5ab29387cc9922f28c08062f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Thu, 11 Nov 2021 10:08:06 +0800 Subject: [PATCH 131/151] Update README.md --- 9 Algorithms Job Interview/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index b7bb001..de5b372 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -2,13 +2,15 @@ 这部分内容是算法问题合集,题目大多来自网络和书籍。我做了下简单的整理,很多题做了一些思路标记。 +## 小结 + 如何更好的写算法题 -ide 工具 & 文本框 -语言基础语法:各常用集合的api,要能够默写 -题型,熟悉各种题目,避免在题目理解上花太多时间跟面试官拉齐 -编程思路和框架,拿到题目以后能快速套思路和代码框架 -编程细节:多练习,总结 +* ide 工具 & 文本框 +* 语言基础语法:各常用集合的api,要能够默写 +* 题目:熟悉各种题目,避免在题目理解上花太多时间跟面试官拉齐 +* 编程思路和框架:拿到题目以后能快速套思路和代码框架 +* 编程细节:多练习,总结 常用解题套路工具 From 215f3f8c05713de54c763ada5a5cd9f7a874578b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Thu, 11 Nov 2021 19:53:02 +0800 Subject: [PATCH 132/151] Update README.md --- 9 Algorithms Job Interview/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index de5b372..93556c0 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -4,9 +4,9 @@ ## 小结 -如何更好的写算法题 +面试中如何更好的写算法题 -* ide 工具 & 文本框 +* ide 工具 & 文本框 ;文本框环境写算法是通常没有智能提示,有些基础数据结构可能要自己定义 * 语言基础语法:各常用集合的api,要能够默写 * 题目:熟悉各种题目,避免在题目理解上花太多时间跟面试官拉齐 * 编程思路和框架:拿到题目以后能快速套思路和代码框架 From 9f03183eecc62502635280e35b53b8227c4ca47a Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 11 Nov 2021 20:00:08 +0800 Subject: [PATCH 133/151] update readme --- ...17\211\346\240\221-\345\273\272\346\240\221.md" | 8 ++------ 9 Algorithms Job Interview/README.md | 14 +++++++------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git "a/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" "b/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" index 47ed4c6..905810c 100644 --- "a/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" +++ "b/9 Algorithms Job Interview/7.2 \344\272\214\345\217\211\346\240\221-\345\273\272\346\240\221.md" @@ -1,16 +1,12 @@ # 二叉树-建树 - - ## 把一个有序整数数组放到二叉树中? 分析:本题考察二叉搜索树的建树方法,简单的递归结构。 -关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。 -而,学会把递归改称非递归也是一种必要的技术。 -毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。 -但是对某些数学问题,就一定要学会用递归去解决。 +关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。而,学会把递归改称非递归也是一种必要的技术。 +毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。但是对某些数学问题,就一定要学会用递归去解决。 diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index de5b372..a4948af 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -146,12 +146,12 @@ void traverse(TreeNode root) { # 参考 - -[九度OJ](http://ac.jobdu.com/index.php) -[leetcode 题目](https://leetcode.com/) -[labuladong 的算法小抄](https://labuladong.gitee.io/algo/1/2/) -[《剑指offer》](剑指offer/README.md) 《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 -[《编程之美》](编程之美/README.md) - + +[九度OJ](http://ac.jobdu.com/index.php) +[leetcode 题目](https://leetcode.com/) +[labuladong 的算法小抄](https://labuladong.gitee.io/algo/1/2/) +[《剑指offer》](剑指offer/README.md) 《剑指offer》里面给出了50到高质量的算法问题,很有学习的必要。 +[《编程之美》](编程之美/README.md) + From 4d67d29412d30ce75f9e78462d8c6d479ea05abc Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 14 Nov 2021 22:42:14 +0800 Subject: [PATCH 134/151] update dp --- ...11\346\237\245\346\211\276\346\240\221.md" | 14 +++++-- ...50\346\200\201\350\247\204\345\210\222.md" | 41 ++++++++++++++----- ...0\345\200\274-\346\214\207\346\225\260.md" | 41 +++++++++++++++---- ...0\345\210\227-\346\237\245\346\211\276.md" | 31 ++++++++++++++ ...7 \344\272\214\345\217\211\346\240\221.md" | 6 ++- ...1\346\240\221-\351\201\215\345\216\206.md" | 25 ++++++++++- ...11\346\220\234\347\264\242\346\240\221.md" | 27 ++++++++++++ 7 files changed, 160 insertions(+), 25 deletions(-) create mode 100644 "9 Algorithms Job Interview/7.5 \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" diff --git "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" index 0a47375..3ce4c39 100644 --- "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" +++ "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" @@ -1,12 +1,15 @@ # 二叉查找树BST -二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。是指一个空树或者具有下列性质的二叉树: +二叉查找树(Binary search tree),也叫`有序二叉树(Ordered binary tree)`,`排序二叉树(Sorted binary tree)`。 + +是指一个空树或者具有下列性质的二叉树: 1. 若任意节点的左子树不为空,则左子树上所有的节点值小于它的根节点值 2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值 3. 任意节点左右子树也为二叉查找树 4. 没有键值(key)相等的节点 + 有序的二叉查找树,中序遍历结果是递增的。 @@ -23,12 +26,15 @@ ``` +### 删除节点 + 删除节点,需要重建排序树 1) 删除节点是叶子节点(分支为0),结构不破坏 2)删除节点只有一个分支(分支为1),结构也不破坏 - 3)删除节点有2个分支,此时删除节点 + 3)删除节点有2个分支,此时删除节点 ; 需要重建树 + 思路一: 选左子树的最大节点,或右子树最小节点替换 ``` @@ -55,6 +61,7 @@ int bisearch_tree_delete(BiSearchTree **tree,ElemType node){ printf("树为空,或想要删除的节点不存在\n"); return -1; } + //该节点为叶子节点,直接删除 if (!target->rChild && !target->lChild) { @@ -86,7 +93,8 @@ int bisearch_tree_delete(BiSearchTree **tree,ElemType node){ target->rChild=target->rChild->rChild; free(del); - } + } + else{ //左右子树均不空,p,t 2个指针一前以后,将左子树最大的节点(肯定是一个最右的节点)替换到删除的节点后,还需要处理左子树最大节点的左子树 BiSearchTree *p=target,*t=target->lChild; diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 01a2222..c2ff383 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -8,7 +8,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余` -动态规划算法也可以说是 `记住求过的解来节省时间` +动态规划算法也可以说是 `记住求过的解来节省时间` ; 比如 Fibonacci数列 中,先直接从最小,最简单的 f(1) , f(2) 开始,自低向上一直到 f(20) , 这就是动态规划的思路 【初始状态】→【决策1】→【决策2】→…→【决策n】→【结束状态】 @@ -21,16 +21,20 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说: -* 最长递增子序列 (LIS Longest Increasing Subsequence) +* Fibonacci数列 [代码参考这里 递归](./递归.md) +* 凑零钱问题 +* 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java) +* 二叉树的最近公共祖先 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/tree/CommonParent.java) +* 链表翻转 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/link/ReverseLink.java) +* 接雨水问题 +* 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 * 最小编辑距离 +* 最长递增子序列 (LIS Longest Increasing Subsequence) * 0-1 背包问题 -* 凑零钱问题 -* 股票问题 -* 接雨水问题 -* Fibonacci数列 -* 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 -* 二叉树的最近公共祖先 -* 链表翻转 + + + +[更多动态规划案例代码实现参考deep-in-java])(https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/framework/dynamic) ``` @@ -69,7 +73,7 @@ DP 和 回溯法 都会用到递归 * 划分问题 * 状态 -* 状态转移方程, 这一步最为困难 +* 状态转移方程, 这一步最为困难 ; 暴力解法就是状态转移方程 * 状态压缩 @@ -87,6 +91,23 @@ for 状态1 in 状态1的所有取值: +## 凑零钱问题 + +凑零钱问题[视频解读参考这里]() + +如果使用贪心策略,并不能得到最优解。 + + + +```Java + +``` + + + + + + diff --git "a/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" "b/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" index 371b804..247983c 100644 --- "a/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" +++ "b/9 Algorithms Job Interview/4.2 \346\225\260\345\200\274-\346\214\207\346\225\260.md" @@ -11,6 +11,19 @@ 不需要考虑溢出。 + +用例: + +``` +2^3 = 8 +0^3 = 0 +2^0 = 1 +2^-3 = 1/(2^3) = 0.125 +0^-3 +``` + + + 分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码: ``` double Power(double base, int exponent) @@ -35,15 +48,6 @@ double Power(double base, int exponent) 2^1 = 2 ``` -用例: - -``` -2 3 = 8 -0 3 = 0 -2 0 = 1 -2 -3 = 1/(2^3) = 0.125 -0 -3 -``` 使用递归实现的代码示例: @@ -62,6 +66,25 @@ double Power(double base, unsigned int exponent) ``` +## Sqrt(x) + +给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 + + +示例 1: +``` +输入:x = 4 +输出:2 +``` +示例 2: +``` +输入:x = 8 +输出:2 +解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 +``` + + + ## 求根号2的值 并且按照我的需要列出指定小数位,比如根号2是1.141 我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141...... 等。。 diff --git "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" index f1763fa..48bd250 100644 --- "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" @@ -141,4 +141,35 @@ int one_appear_count(int n); +## 搜索旋转排序数组 + + +整数数组 nums 按升序排列,数组中的值 互不相同 。 + +在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 + +给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。 + + +示例 1: + +``` +输入:nums = [4,5,6,7,0,1,2], target = 0 +输出:4 +``` + +示例 2: +``` +输入:nums = [4,5,6,7,0,1,2], target = 3 +输出:-1 +``` + + + + + + + + + diff --git "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" index 1bc6d32..58bac03 100644 --- "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" +++ "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" @@ -107,8 +107,7 @@ TreeNode invertTree(TreeNode root) { - -## 二叉树两个结点的最低共同父结点 +## 二叉树两个结点的最低共同父结点 (最近公共祖先) 设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分 @@ -119,6 +118,9 @@ TreeNode invertTree(TreeNode root) { + + + ## 求一个二叉树中任意两个节点间的最大距离 两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。 diff --git "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" index f072186..c98ae50 100644 --- "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" +++ "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" @@ -49,13 +49,30 @@ 分析:这道题本质上还是考查二元树的遍历。对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。 +## 二元树的最小深度 + + +例如:输入二元树: +``` + + 10 + / \ + 6 14 + / \ + 12 16 +``` + +输出该树的最小深度2。 + + ## 判断整数序列是不是二元查找树的后序遍历结果 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 如果是返回true,否则返回false。 -例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: + +例如输入`5、7、6、9、11、10、8`,由于这一整数序列是如下树的后序遍历结果: ``` 8 / \ @@ -66,3 +83,9 @@ 因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 + + + + + + diff --git "a/9 Algorithms Job Interview/7.5 \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" "b/9 Algorithms Job Interview/7.5 \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" new file mode 100644 index 0000000..31b323c --- /dev/null +++ "b/9 Algorithms Job Interview/7.5 \344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.md" @@ -0,0 +1,27 @@ +# 二叉搜索树 + +关于二叉查找树特性[参考这里](../4%20Tree/2-二叉查找树/二叉查找树.md) + +## 验证二叉搜索树 + + +## 二叉搜索树中的节点搜索 + + +## 二叉搜索树中的插入操作 + + +## 删除二叉搜索树中的节点 + + + + + + + + + + + + + From 363cf82d546f0c1037394a86c68ff4c1f9c8d3da Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 15 Nov 2021 01:20:46 +0800 Subject: [PATCH 135/151] update dp and tree --- ...11\346\237\245\346\211\276\346\240\221.md" | 2 +- ...50\346\200\201\350\247\204\345\210\222.md" | 19 +++++--- ...52\345\277\203\347\256\227\346\263\225.md" | 14 ++++-- .../\351\200\222\345\275\222.md" | 48 +++++++++++++++++-- ...60\345\210\227\351\227\256\351\242\230.md" | 2 - ...1\346\240\221-\351\201\215\345\216\206.md" | 6 +++ 6 files changed, 72 insertions(+), 19 deletions(-) diff --git "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" index 3ce4c39..6e5ce4f 100644 --- "a/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" +++ "b/4 Tree/2-\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221/\344\272\214\345\217\211\346\237\245\346\211\276\346\240\221.md" @@ -10,7 +10,7 @@ 4. 没有键值(key)相等的节点 -有序的二叉查找树,中序遍历结果是递增的。 +有序的二叉查找树,中序遍历结果是递增的。 `左小右大` ``` diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index c2ff383..eaeef85 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -24,21 +24,22 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 * Fibonacci数列 [代码参考这里 递归](./递归.md) * 凑零钱问题 * 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java) -* 二叉树的最近公共祖先 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/tree/CommonParent.java) -* 链表翻转 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/link/ReverseLink.java) -* 接雨水问题 +* 打家劫舍问题 : num[i] 代表第i个房子中的现金数目,从房子中取钱的最大数目,约束是相邻房子的钱不能同时取出 +* 接雨水问题 : * 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 * 最小编辑距离 -* 最长递增子序列 (LIS Longest Increasing Subsequence) +* 最长递增子序列 (LIS Longest Increasing Subsequence),如`【5,6,7,3,2,8】` 最长子序列 `【5,6,7,8】`, 输出4 +* 最大子数组和 +* 最长公共子序列 (LIS Longest public Subsequence) +* 最长回文子序列 (LIS Longest public Subsequence) * 0-1 背包问题 - [更多动态规划案例代码实现参考deep-in-java])(https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/framework/dynamic) +青蛙跳阶问题 ``` -# 青蛙跳阶问题 想跳到第10级台阶,要么是先跳到第9级,然后再跳1级台阶上去;要么是先跳到第8级,然后一次迈2级台阶上去。 同理,要想跳到第9级台阶,要么是先跳到第8级,然后再跳1级台阶上去;要么是先跳到第7级,然后一次迈2级台阶上去。 要想跳到第8级台阶,要么是先跳到第7级,然后再跳1级台阶上去;要么是先跳到第6级,然后一次迈2级台阶上去 @@ -53,6 +54,10 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 ``` + + + + ### DP VS 分治法 与[分治法](分治算法.md)不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 @@ -93,7 +98,7 @@ for 状态1 in 状态1的所有取值: ## 凑零钱问题 -凑零钱问题[视频解读参考这里]() +凑零钱问题[视频解读参考这里](https://www.ixigua.com/6881883015832666635?wid_try=1) 如果使用贪心策略,并不能得到最优解。 diff --git "a/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" "b/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" index f5ac09d..400c5dd 100644 --- "a/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" +++ "b/8 Algorithms Analysis/\350\264\252\345\277\203\347\256\227\346\263\225.md" @@ -3,13 +3,17 @@ 不追求最优解,只找到满意解。 -#### 赫夫曼编码 +#### 其它案例 + +* 跳跃游戏 +* 射击气球 +* 装箱问题 + + + +## 赫夫曼编码 -#### 其它案例 -找回零钱问题 -装箱问题 - diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 94f9d3f..7f6b53f 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -15,6 +15,7 @@ 递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。 + ### 递归公式 [快排](../6%20Sort/README.md) @@ -72,11 +73,12 @@ void traverse(TreeNode root) { ### 其它案例 +* 斐波那契数列 * 阶乘计算 -* 梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案) -* 快速排序 -* 很多树算法都是递归思想实现 - +* 快速排序 +* 链表翻转 +* 很多树算法都是递归思想实现, 如 二叉树的最近公共祖先 +* 梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案) ## 斐波那契数列 @@ -196,6 +198,44 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ +## 链表翻转 + + +链表翻转 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/link/ReverseLink.java) + + +```Java +//翻转链表前n个节点 + static LinkedNode tmp;//需要一个外部的临时变量 + public static LinkedNode reverseN(LinkedNode head, int n){ + //LinkedNode tmp = null; + if (n == 1) { + tmp = head.next; + return head; + } + + LinkedNode tail = reverseN(head.next, n-1); + + head.next.next = head; //后n-1个节点 与 第 1 个节点 指向 翻转 + head.next = tmp; + + return tail; + } + +``` + + + +## 二叉树的最近公共祖先 + +二叉树的最近公共祖先 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/tree/CommonParent.java) + + +```Java + +``` + + diff --git "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" index 65b823d..e2b4756 100644 --- "a/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5 \346\225\260\347\273\204\346\225\260\345\210\227\351\227\256\351\242\230.md" @@ -80,8 +80,6 @@ int fib(int n) { - - ## 递减数列左移后的数组中找数 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} diff --git "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" index c98ae50..d4d513d 100644 --- "a/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" +++ "b/9 Algorithms Job Interview/7.1 \344\272\214\345\217\211\346\240\221-\351\201\215\345\216\206.md" @@ -66,6 +66,12 @@ +## 完全二叉树的节点个数 + + + + + ## 判断整数序列是不是二元查找树的后序遍历结果 From 4a31531cf6ff7f938f785ce010b5a449edc91227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Mon, 15 Nov 2021 01:22:38 +0800 Subject: [PATCH 136/151] =?UTF-8?q?Update=20=E9=80=92=E5=BD=92.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\351\200\222\345\275\222.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 7f6b53f..0374c7f 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -233,6 +233,24 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ ```Java +TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + // base case + if (root == null) return null; + if (root == p || root == q) return root; + + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + // 情况 1 + if (left != null && right != null) { + return root; + } + // 情况 2 + if (left == null && right == null) { + return null; + } + // 情况 3 + return left == null ? right : left; +} ``` From ec09f22df47b904bbd38c3e8e9ba234acc679f2c Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 15 Nov 2021 01:29:08 +0800 Subject: [PATCH 137/151] update tree --- .../\351\200\222\345\275\222.md" | 33 +++++++++---------- ...7 \344\272\214\345\217\211\346\240\221.md" | 20 +++++++++++ 2 files changed, 36 insertions(+), 17 deletions(-) diff --git "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" index 0374c7f..761ed1e 100644 --- "a/8 Algorithms Analysis/\351\200\222\345\275\222.md" +++ "b/8 Algorithms Analysis/\351\200\222\345\275\222.md" @@ -232,25 +232,24 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){ ```Java - TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { - // base case - if (root == null) return null; - if (root == p || root == q) return root; - - TreeNode left = lowestCommonAncestor(root.left, p, q); - TreeNode right = lowestCommonAncestor(root.right, p, q); - // 情况 1 - if (left != null && right != null) { - return root; - } - // 情况 2 - if (left == null && right == null) { - return null; + // base case + if (root == null) return null; + if (root == p || root == q) return root; + + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + // 情况 1 :p, q 在 root 为根的树中 + if (left != null && right != null) { + return root; + } + // 情况 2 :p, q 不在 在 root 为根的树中 + if (left == null && right == null) { + return null; + } + // 情况 3 : p, q 只有1个在root 为根的树中 + return left == null ? right : left; } - // 情况 3 - return left == null ? right : left; -} ``` diff --git "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" index 58bac03..28bcff2 100644 --- "a/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" +++ "b/9 Algorithms Job Interview/7 \344\272\214\345\217\211\346\240\221.md" @@ -117,6 +117,26 @@ TreeNode invertTree(TreeNode root) { 分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。 +``` +TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + // base case + if (root == null) return null; + if (root == p || root == q) return root; + + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + // 情况 1 :p, q 在 root 为根的树中 + if (left != null && right != null) { + return root; + } + // 情况 2 :p, q 不在 在 root 为根的树中 + if (left == null && right == null) { + return null; + } + // 情况 3 : p, q 只有1个在root 为根的树中 + return left == null ? right : left; + } +``` From 81e6ec3f533d1f8626c3d5995436c6a8931601a2 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 15 Nov 2021 01:44:14 +0800 Subject: [PATCH 138/151] update dp --- ...50\346\200\201\350\247\204\345\210\222.md" | 27 +++++++++++++-- ...6\344\270\262-\346\237\245\346\211\276.md" | 33 ++++++++++++++++++- ...5\210\227-nsum\351\227\256\351\242\230.md" | 3 +- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index eaeef85..a034b8b 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -25,7 +25,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 * 凑零钱问题 * 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java) * 打家劫舍问题 : num[i] 代表第i个房子中的现金数目,从房子中取钱的最大数目,约束是相邻房子的钱不能同时取出 -* 接雨水问题 : +* 接雨水问题 :num[i]表示柱子高度,计算下雨之后能接多少雨水 * 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 * 最小编辑距离 * 最长递增子序列 (LIS Longest Increasing Subsequence),如`【5,6,7,3,2,8】` 最长子序列 `【5,6,7,8】`, 输出4 @@ -56,8 +56,6 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 - - ### DP VS 分治法 与[分治法](分治算法.md)不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 @@ -105,6 +103,29 @@ for 状态1 in 状态1的所有取值: ```Java +//递归解法,处理重叠子问题, 使用 dp[amount+1] 备忘录 + int coinChange2(int[] coins, int amount) { + int[] dp = new int[amount + 1]; + + // 数组大小为 amount + 1,初始值也为 amount + 1 + // 为啥 dp 数组初始化为 amount + 1 呢,因为凑成 amount 金额的硬币数最多只可能等于 amount(全用 1 元面值的硬币),所以初始化为 amount + 1 就相当于初始化为正无穷 + Arrays.fill(dp, amount + 1); + + // base case + dp[0] = 0; + // 外层 for 循环在遍历所有状态的所有取值 + for (int i = 0; i < dp.length; i++) { + // 内层 for 循环在求所有选择的最小值 + for (int coin : coins) { + // 子问题无解,跳过 + if (i - coin < 0) { + continue; + } + dp[i] = Math.min(dp[i], 1 + dp[i - coin]); + } + } + return (dp[amount] == amount + 1) ? -1 : dp[amount]; + } ``` diff --git "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" index c7b6aa9..18e9d22 100644 --- "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" @@ -193,7 +193,7 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){ ``` -## 对称子字符串的最大长度 +## 对称子字符串的最大长度 (最长回文子串) 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 @@ -215,6 +215,37 @@ int max_symmetrical_char_length(const char *scr){ ``` +```Java + public String longestPalindrome(String s) { + String res = ""; + for (int i = 0; i < s.length(); i++) { + // 以 s[i] 为中心的最长回文子串 + String s1 = palindrome(s, i, i); + + // 以 s[i] 和 s[i+1] 为中心的最长回文子串 + String s2 = palindrome(s, i, i + 1); + + // res = longest(res, s1, s2) + res = res.length() > s1.length() ? res : s1; + res = res.length() > s2.length() ? res : s2; + } + return res; + } + + //实现一个函数来寻找最长回文串 + String palindrome(String s, int l, int r) { + // 防止索引越界 + while (l >= 0 && r < s.length() + && s.charAt(l) == s.charAt(r)) { + // 向两边展开 + l--; r++; + } + // 返回以 s[l] 和 s[r] 为中心的最长回文串 + return s.substring(l + 1, r); + } +``` + + ## 子串匹配的个数 diff --git "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" index 895026f..d76c014 100644 --- "a/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" +++ "b/9 Algorithms Job Interview/5.2 \346\225\260\345\210\227-nsum\351\227\256\351\242\230.md" @@ -81,7 +81,6 @@ int findaddends(int *data,int length,int sum,int *a,int *b); - ## 求子数组的最大和(最大字段和) 输入一个整形数组,数组里有正数也有负数。 @@ -91,7 +90,7 @@ int findaddends(int *data,int length,int sum,int *a,int *b); 例如输入的数组为`1, -2, 3, 10, -4, 7, 2, -5` ,和最大的子数组为`3, 10, -4, 7, 2` ,因此输出为该子数组的和18。 1. 蛮力法 fmax(i,j) 找出最大的值,3重循环 ,复杂度 0(n^3) -2. maxendindhere保存当前累加的和,如果<0,就把maxendinghere清零 , max保存最终的最大和; 如果都是负数 +2. `动态规划` maxendindhere保存当前累加的和,如果<0, 就把maxendinghere清零 , max保存最终的最大和; 如果都是负数 ``` int maxSumOfVector(int *data,int length){ From 067187ee33a91fc38e760dd50a6aac8f0a5d5cc0 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 15 Nov 2021 01:46:49 +0800 Subject: [PATCH 139/151] update readme --- 9 Algorithms Job Interview/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index 457416a..3dbf57b 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -18,6 +18,7 @@ * 数组,字符串问题:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。 * 二叉树问题:递归 * [动态规划问题](../8%20Algorithms%20Analysis/动态规划.md) +* [常见算法题目Java实现](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo) ## [字符串](1%20字符串.md) From 15d5934f07f29af622d43dd2d05c937f2d640b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Wed, 17 Nov 2021 01:32:45 +0800 Subject: [PATCH 140/151] Update README.md --- 1 String/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1 String/README.md b/1 String/README.md index 07353c5..620f262 100644 --- a/1 String/README.md +++ b/1 String/README.md @@ -25,7 +25,7 @@ ## 滑动窗口 -使用滑动窗口解决字符串问题,代码框架 +使用滑动窗口解决字符串子串问题,代码框架 ``` int left = 0, right = 0; From 10184a3450059869a45c36b81b13836468e5d059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=BC=80=E5=8F=91=E5=B0=8F=E5=86=89?= <510495266@qq.com> Date: Wed, 17 Nov 2021 01:33:09 +0800 Subject: [PATCH 141/151] Create README.md From b0c67229b3ee7afaab7d983d1ee8ae2e240171fb Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 27 Nov 2021 02:15:19 +0800 Subject: [PATCH 142/151] add link --- 2 List/README.md | 33 ++++-- .../\347\272\242\351\273\221\346\240\221.md" | 2 +- ...1 \345\255\227\347\254\246\344\270\262.md" | 8 +- ...6\344\270\262-\346\237\245\346\211\276.md" | 39 ++++--- .../2 \351\223\276\350\241\250.md" | 13 ++- ...0\345\210\227-\346\216\222\345\272\217.md" | 2 - ...0\345\210\227-\346\237\245\346\211\276.md" | 27 ++++- 9 Algorithms Job Interview/README.md | 105 +++++++++--------- README.md | 33 +++--- 9 files changed, 160 insertions(+), 102 deletions(-) diff --git a/2 List/README.md b/2 List/README.md index a8a29af..796ae89 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -4,6 +4,7 @@ * 双向链表 * 双向循环链表 + ## 链表 ### 应用场景 @@ -11,18 +12,6 @@ * [redis slowlog](Redis%20slowlog.md) -### 扩缩容 - -简单说下编程语言 java, golang中 LinkList的扩缩容的策略。 - -java 中扩容,每次扩容新增原先容量的 1/2 -``` - int newCapacity = oldCapacity + (oldCapacity >> 1); -``` - -这个就不介绍了。重点说下双向链表。 - - ### 链表 VS 数组 特点 @@ -38,12 +27,27 @@ java 中扩容,每次扩容新增原先容量的 1/2 +### 扩缩容 + +简单说下编程语言 java, golang中 LinkList的扩缩容的策略。 + +java 中扩容,每次扩容新增原先容量的 1/2 +``` + int newCapacity = oldCapacity + (oldCapacity >> 1); +``` + +这个就不介绍了。重点说下双向链表。 + + + ## 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 双向链表克服了单链表中访问某个节点前驱节点(插入,删除操作时),只能从头遍历的问题。 +缺点是: 多了1倍的额外的指针空间大小。 + ``` typedef int Value typedef struct Entry{ @@ -53,6 +57,11 @@ typedef struct Entry{ ``` +应用场景 + +* mysql B+树 叶子节点就使用 双向链表,方便 `age<10` 类似条件查询,或者 倒序查询 如 `order by desc` ,从后向前遍历数据 + + ## 循环链表 最后一个节点指针指向头节点的链表 diff --git "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" index ff83a6d..48aa007 100644 --- "a/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" +++ "b/4 Tree/9-\347\272\242\351\273\221\346\240\221 R-B tree/\347\272\242\351\273\221\346\240\221.md" @@ -1,6 +1,6 @@ # 红黑树 (red-black tree) -红黑树(Red Black Tree) 是一种自平衡二叉查找树。一种特化的AVL树,在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它可以在O(log n)时间内做查找,插入和删除。 +红黑树(Red Black Tree) 是一种自平衡二叉查找树。一种特化的[AVL树](../3-平衡树AVL/README.md),在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。 它可以在O(log n)时间内做查找,插入和删除。 它的每个结点都被“着色”为红色或者黑色,这些结点的颜色被用来检测树的平衡性。 diff --git "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" index 1f67dc4..47565ce 100644 --- "a/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" +++ "b/9 Algorithms Job Interview/1 \345\255\227\347\254\246\344\270\262.md" @@ -4,11 +4,13 @@ * 回文判断 * 字符(串)统计 -* 字符串的压缩 -* 字符串的排列和组合 * [子串查找](1.1%20字符串-查找.md) -* [字符删除](1.2%20字符串-删除.md) * [字符串修改](1.3%20字符串-修改.md) 如单词反转/移动等 +* [字符删除](1.2%20字符串-删除.md) +* 字符串的压缩 +* 字符串的排列和组合 + + ## 判断字符串是否是回文 diff --git "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" index 18e9d22..7618a01 100644 --- "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" @@ -45,19 +45,6 @@ char char_first_appear_once(const unsigned char *source){ 题目扩展:这里的字符换成整数,整数数量几十TB,海量数据处理,显然hash方法不可能,没有那么大得内容 -## 请编写能直接实现strstr()函数功能的代码。 - -> strstr(str1,str2) 判断str2是否是str1的子串。 - -``` -/* -@ret 有就返回第一次出现子串的地址,否则返回NULL -*/ -char *strstr(const char *source, const char *target){ - -} -``` - ### 字符串中找出连续最长的数字子串 @@ -164,11 +151,6 @@ int lengthOfLongestSubstring(string s) { -## 求最大连续递增数字子串 - -如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。 - - ## 最长公共子串问题 @@ -247,6 +229,27 @@ int max_symmetrical_char_length(const char *scr){ + +## 求最大连续递增数字子串 + +如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。 + + +## 请编写能直接实现strstr()函数功能的代码。 + +> strstr(str1,str2) 判断str2是否是str1的子串。 + +``` +/* +@ret 有就返回第一次出现子串的地址,否则返回NULL +*/ +char *strstr(const char *source, const char *target){ + +} +``` + + + ## 子串匹配的个数 已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,如果没有返回0,有的话返回子字符串的个数。 diff --git "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" index 4cf7da9..e1fe717 100644 --- "a/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" +++ "b/9 Algorithms Job Interview/2 \351\223\276\350\241\250.md" @@ -10,12 +10,14 @@ * 链表中是否有环 -链表结点定义如下: +链表结点定义如下: +``` struct ListNode { int m_nKey; ListNode* m_pNext; }; +``` @@ -110,6 +112,15 @@ struct ComplexNode 请完成函数`ComplexNode* Clone(ComplexNode* pHead)`,以复制一个复杂链表。 +这个题目难点在于: + + + + + + + + diff --git "a/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" "b/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" index c4d2950..b01a548 100644 --- "a/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" +++ "b/9 Algorithms Job Interview/5.1 \346\225\260\345\210\227-\346\216\222\345\272\217.md" @@ -25,8 +25,6 @@ void sort(int * a, int length) `动态规划` - - ## 扑克牌的顺子 diff --git "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" index 48bd250..ac9bd9b 100644 --- "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" @@ -87,13 +87,38 @@ topMaxK(int *a,int length, int k); ## 找第k大的数 -比如 1,2,3,4,5,6,7和8这8个数字,低3大的数字是 6 +比如 `1,2,3,4,5,6,7,8 `这 8个数字,第3大的数字是 6 ``` int topK(int * a, int length, int k) ``` +```Java +//冒泡实现 + public int findK(int[] nums, int k){ + //base case + if (nums== null || nums.length < k) { + return -1; + } + + for(int i=1; i<=k; i++){ + for(int j=0; j nums[next]){ + int tmp = nums[j]; + nums[j] = nums[next]; + nums[next] = tmp; + } + } + } + + return nums[nums.length-k]; + } +``` + + + ## 最长公共子序列 (动态规划的经典题目) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index 3dbf57b..99db4ec 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -13,7 +13,7 @@ * 编程细节:多练习,总结 -常用解题套路工具 +## 常用解题套路工具 * 数组,字符串问题:二分查找、 快慢指针、 左右指针、 滑动窗口、 前缀和数组、 差分数组。 * 二叉树问题:递归 @@ -21,6 +21,59 @@ * [常见算法题目Java实现](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo) +## 刷题框架套路 + + +遍历 + +``` +# 数组遍历框架 +void traverse(int[] arr) { + for (int i = 0; i < arr.length; i++) { + // 迭代访问 arr[i] + } +} + +# 链表遍历框架 +void traverse(ListNode head) { + for (ListNode p = head; p != null; p = p.next) { + // 迭代访问 p.val + } +} + +``` + + +递归 + +``` +# 链表递归 +void traverse(ListNode head) { + // 递归访问 head.val + traverse(head.next); +} + + +# 二叉树递归 +void traverse(TreeNode root) { + traverse(root.left); + traverse(root.right); +} + +# 多叉树递归 +void traverse(TreeNode root) { + for (TreeNode child : root.children) + traverse(child); +} + +# 图的递归:,用个布尔数组 visited 做标记就行了 + +``` + + + + + ## [字符串](1%20字符串.md) 计算机处理的数据除了数值,就是字符。字符处理的常见问题包括: @@ -95,56 +148,6 @@ -# 刷题框架套路 - -遍历 - -``` -# 数组遍历框架 -void traverse(int[] arr) { - for (int i = 0; i < arr.length; i++) { - // 迭代访问 arr[i] - } -} - -# 链表遍历框架 -void traverse(ListNode head) { - for (ListNode p = head; p != null; p = p.next) { - // 迭代访问 p.val - } -} - -``` - - -递归 - -``` -# 链表递归 -void traverse(ListNode head) { - // 递归访问 head.val - traverse(head.next); -} - - -# 二叉树递归 -void traverse(TreeNode root) { - traverse(root.left); - traverse(root.right); -} - -# 多叉树递归 -void traverse(TreeNode root) { - for (TreeNode child : root.children) - traverse(child); -} - -# 图的递归:,用个布尔数组 visited 做标记就行了 - - -``` - - # 参考 diff --git a/README.md b/README.md index e3d6f0f..ce25ff7 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,10 @@ * 链表 * 双向链表 +### [数组](2%20List/README.md) + +* [数组数列问题](%20Algorithms%20Job%20Interview/5%20数组数列问题.md) + 数组和链表结构是基础结构,散列表、栈、队列、堆、树、图等等各种数据结构都基于数组和链表结构实现。 ### [队列](2%20Queue/README.md) @@ -36,13 +40,13 @@ ### [字符串算法](1%20String/README.md) -* 排序 -* 查找 +* 子串查找 [字符串常见题目参考这里](%20Algorithms%20Job%20Interview/1%20字符串.md) * BF算法 * KMP算法 * BM算法 * 正则表达式 * 数据压缩 +* 排序 ### [树](4%20Tree/README.md) @@ -92,22 +96,25 @@ ### [查找算法](7%20Search/README.md) -* 顺序表查找:顺序查找 -* 有序表查找:二分查找 + +* 哈希表: O(1) [hashtable实现参考这里](../3%20Hash%20Table/README.md) +* 有序表查找:二分查找 +* 顺序表查找:顺序查找, 复杂度O(N) * 分块查找: 块内无序,块之间有序;可以先二分查找定位到块,然后再到`块`中顺序查找 * 动态查找: 二叉排序树,AVL树,B- ,B+(这里之所以叫 `动态查找表`,是因为表结构是查找的过程中动态生成的) -* 哈希表: O(1) + ## [算法设计思想](8%20Algorithms%20Analysis/README.md) - -* 迭代法 -* 穷举搜索法 -* 递推法 -* 动态规划 -* 贪心算法 -* 回溯 -* 分治算法 + + +* [递归](8%20Algorithms%20Analysis/递归.md) +* [分治算法](8%20Algorithms%20Analysis/分治算法.md) +* [动态规划](8%20Algorithms%20Analysis/动态规划.md) +* [回溯法](8%20Algorithms%20Analysis/回溯法.md) +* [迭代法](8%20Algorithms%20Analysis/迭代法.md) +* [穷举搜索法](8%20Algorithms%20Analysis/穷举搜索法.md) +* [贪心算法](8%20Algorithms%20Analysis/贪心算法.md) From 0b2fb94f5ad0c813fd8d51cf27f8963dad95a317 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 27 Nov 2021 02:32:30 +0800 Subject: [PATCH 143/151] add link --- 9 Algorithms Job Interview/README.md | 65 ++++++++++++++++++++++++++-- README.md | 25 +++++------ 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index 99db4ec..779c80f 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -24,7 +24,7 @@ ## 刷题框架套路 -遍历 +### 遍历 ``` # 数组遍历框架 @@ -41,12 +41,21 @@ void traverse(ListNode head) { } } +void traverse(ListNode head) { + + ListNode p = head; + while(p.next != null) + ... + p = p.next + +} + ``` -递归 +### 递归 -``` +```Java # 链表递归 void traverse(ListNode head) { // 递归访问 head.val @@ -71,6 +80,56 @@ void traverse(TreeNode root) { ``` +### 二分查找 + +```Java +public int bsearch(int[] nums, int target){ + + if(nums == null) { + return -1; + } + + int low = 0; + int high = nums.length; + + while(low < high){ + middle = (high + low ) / 2; + if(nums[middle] < target){ + low = middle; + } else if (nums[middle] == target) { + high = middle;// + } else { + high = middle; + } + } + + return low; + } +``` + +### 滑动窗口 + +```Java + + +``` + + +### 排序算法 + +[排序算法](../6%20Sort/README.md) + +```Java + +#快排 quickSort + + + +#归并排序 mergeSort + + + +``` diff --git a/README.md b/README.md index ce25ff7..a8e561b 100644 --- a/README.md +++ b/README.md @@ -51,20 +51,19 @@ ### [树](4%20Tree/README.md) -* 二叉树 -* 二叉查找树 -* 伸展树(splay tree 分裂树) -* 平衡二叉树AVL -* 红黑树 -* B树,B+,B* -* R树 -* Trie树(前缀树) -* 后缀树 -* 最优二叉树(赫夫曼树) -* 二叉堆 (大根堆,小根堆) -* 二项树 -* 二项堆 +* 二叉树 [快速排序](6%20Sort/README.md)就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历 +* [二叉查找树BST](4%20Tree/2-二叉查找树/二叉查找树.md) 有序的二叉树,中序遍历结果是递增的 +* [平衡二叉树 AVL树](4%20Tree/3-平衡树AVL/README.md) 绝对平衡二叉树; +* [红黑树](4%20Tree/9-红黑树%20R-B%20tree/红黑树.md) 弱平衡二叉树;使用广泛 +* [B树](4%20Tree/7-B树/B树.md) +* [B+树](4%20Tree/7-B树/B+树.md) mysql 索引使用 B+树 的数据结构 +* [字典树trie](4%20Tree/4-字典树Trie/README.md) 字典树也叫前缀树,单词查找树 +* [二叉堆](4%20Tree/8-堆/堆.md) +* [伸展树](4%20Tree/5-伸展树/伸展树.md) +* [后缀树](4%20Tree/6-后缀树/后缀树.md) * 斐波那契堆(Fibonacci Heap) +* 最优二叉树(赫夫曼树) + ### [图的算法](5%20Graph/README.md) From d97d7c491c19db264030b1f72d6d2d7f066e2875 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sat, 27 Nov 2021 02:39:27 +0800 Subject: [PATCH 144/151] add algo frm --- 6 Sort/README.md | 15 ++++++++------- 9 Algorithms Job Interview/README.md | 24 +++++++++++++++++++++--- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/6 Sort/README.md b/6 Sort/README.md index c598f11..8878542 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -14,7 +14,7 @@ * 归并排序 : 将无序的数组,分成2个子数组分别排序,然后再merge ; 分治递归, 二叉树的后续遍历思路 * 插入排序 : * 希尔排序 : -* 堆排序 : +* [堆排序](../4%20Tree/8-堆/堆.md) : ### 线性排序算法 @@ -71,7 +71,7 @@ 代码框架如下 -``` +```C void quicksort(int *a, int left, int right){ if (left Date: Mon, 29 Nov 2021 01:13:02 +0800 Subject: [PATCH 145/151] add frm --- 2 List/README.md | 5 ++ 9 Algorithms Job Interview/README.md | 102 +++++++++++++++++++++++---- 2 files changed, 95 insertions(+), 12 deletions(-) diff --git a/2 List/README.md b/2 List/README.md index 796ae89..2ff036e 100644 --- a/2 List/README.md +++ b/2 List/README.md @@ -60,6 +60,7 @@ typedef struct Entry{ 应用场景 * mysql B+树 叶子节点就使用 双向链表,方便 `age<10` 类似条件查询,或者 倒序查询 如 `order by desc` ,从后向前遍历数据 +* Java AQS 中的等待队列, 是一个双端 双向链表 的结构 (FIFO 结构) ## 循环链表 @@ -78,3 +79,7 @@ typedef struct Entry{ + + + + diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index ab373fb..d703c67 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -35,12 +35,6 @@ void traverse(int[] arr) { } # 链表遍历框架 -void traverse(ListNode head) { - for (ListNode p = head; p != null; p = p.next) { - // 迭代访问 p.val - } -} - void traverse(ListNode head) { ListNode p = head; @@ -49,10 +43,10 @@ void traverse(ListNode head) { p = p.next } - ``` + ### 递归 ```Java @@ -79,10 +73,36 @@ void traverse(TreeNode root) { ``` +比如,二叉树的最近公共祖先 + +```Java +TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + // base case + if (root == null) return null; + if (root == p || root == q) return root; + + TreeNode left = lowestCommonAncestor(root.left, p, q); + TreeNode right = lowestCommonAncestor(root.right, p, q); + // 情况 1 :p, q 在 root 为根的树中 + if (left != null && right != null) { + return root; + } + // 情况 2 :p, q 不在 在 root 为根的树中 + if (left == null && right == null) { + return null; + } + // 情况 3 : p, q 只有1个在root 为根的树中 + return left == null ? right : left; + } +``` + ### 二分查找 +[查找算法](../7%20Search/README.md) + ```Java +// 1, 2, 2, 2, 2, 3 public int bsearch(int[] nums, int target){ if(nums == null) { @@ -90,16 +110,16 @@ public int bsearch(int[] nums, int target){ } int low = 0; - int high = nums.length; + int high = nums.length;// 注意 while(low < high){ middle = (high + low ) / 2; if(nums[middle] < target){ - low = middle; + low = middle + 1; } else if (nums[middle] == target) { - high = middle;// + high = middle;//继续向左早 } else { - high = middle; + high = middle; // 注意 , 这里没有 -1 } } @@ -107,11 +127,69 @@ public int bsearch(int[] nums, int target){ } ``` + +### 快慢指针 + +如下判断链表是否有环 + +``` +public static boolean hasCycle(LinkNode head) { + if(head == null) { + return false; + } + + LinkNode p = head, q = head; + while(p.next != null && p.next.next != null && q.next != null) { + p = p.next.next; + q = q.next; + if(p == q) { + return true; + } + } + return false; + } +``` + + +### 左右指针 + +``` + +``` + + ### 滑动窗口 +滑动窗口: 无重复字符的最长子串 + ```Java +public static int longestSubString(char[] s){ + int left = 0, right = 0; + int res = 0; // 记录最长结果 + + Map window = new HashMap(); + while (right < s.length) { + Character c = s[right]; + + //窗口变大 + right++; + window.put(c, window.getOrDefault(c, 0) + 1); //java写的麻烦,不一定记得这个api + + if (window.get(c) > 1) { + //判断左侧窗口是否要收缩 + char d = s[left]; + + left ++; + window.put(d, window.get(d)-1); + } + + // 在这里更新答案 + res = res > (right-left) ? res: (right-left); + } + return res; +} ``` @@ -126,7 +204,7 @@ void quicksort(int[] nums, int left, int right){ if (left Date: Mon, 29 Nov 2021 01:30:30 +0800 Subject: [PATCH 146/151] update string --- 1 String/java String.md | 3 +++ 9 Algorithms Job Interview/README.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/1 String/java String.md b/1 String/java String.md index bcf2e29..e84a90e 100644 --- a/1 String/java String.md +++ b/1 String/java String.md @@ -3,3 +3,6 @@ Java 中 String 实现。 + + + diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index d703c67..b2ce9c5 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -163,7 +163,7 @@ public static boolean hasCycle(LinkNode head) { 滑动窗口: 无重复字符的最长子串 ```Java - +//如 ”abcabbcbb“ 输出 3 public static int longestSubString(char[] s){ int left = 0, right = 0; int res = 0; // 记录最长结果 From 0de0504b9dcbd9ef61ad1c1f09a68ef1afe9dfa4 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Tue, 30 Nov 2021 23:50:23 +0800 Subject: [PATCH 147/151] add quicksort --- 6 Sort/README.md | 38 +++++++++++++++++++ ...50\346\200\201\350\247\204\345\210\222.md" | 33 ++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/6 Sort/README.md b/6 Sort/README.md index 8878542..1ad64c2 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -143,6 +143,44 @@ void quicksort(int *a, int left, int right){ ``` +```Java +// pivot 选择 尾部节点, 代码写起来更加简单; 移动元素更方便 +static int partition(int[] nums, int left, int right){ + + int pivot = nums[right];//选尾部节点作为 pivot + int end = right; + + right--; + while (left < right) { + + if (nums[left] <= pivot) { + left ++ ; + continue; + } + + //元素比 pivot 大,右边窗口变小 + //swap left & right + swap(nums, left, right); + right--; + + } + + // 跟 pivot 元素置换 + int i = 0; + if (nums[left] <= pivot) { + //swap left+1 & pivot + i = left +1; + } else {//swap left & pivot + i = left ; + } + + swap(nums, i, end); + + return i; + } +``` + + ![](./qsort.gif) diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index a034b8b..66d3522 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -97,6 +97,7 @@ for 状态1 in 状态1的所有取值: ## 凑零钱问题 凑零钱问题[视频解读参考这里](https://www.ixigua.com/6881883015832666635?wid_try=1) +[实现代码这里](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/list) 如果使用贪心策略,并不能得到最优解。 @@ -104,11 +105,12 @@ for 状态1 in 状态1的所有取值: ```Java //递归解法,处理重叠子问题, 使用 dp[amount+1] 备忘录 - int coinChange2(int[] coins, int amount) { + int coinChange2(int[] coins, int amount) { int[] dp = new int[amount + 1]; // 数组大小为 amount + 1,初始值也为 amount + 1 - // 为啥 dp 数组初始化为 amount + 1 呢,因为凑成 amount 金额的硬币数最多只可能等于 amount(全用 1 元面值的硬币),所以初始化为 amount + 1 就相当于初始化为正无穷 + // 为啥 dp 数组初始化为 amount + 1 呢? + // 因为凑成 amount 金额的硬币数最多只可能等于 amount(全用 1 元面值的硬币),所以初始化为 amount + 1 就相当于初始化为正无穷 Arrays.fill(dp, amount + 1); // base case @@ -125,11 +127,36 @@ for 状态1 in 状态1的所有取值: } } return (dp[amount] == amount + 1) ? -1 : dp[amount]; - } + } ``` +## 股票问题 + + +``` +``` + + +## 接雨水问题 + +num[i]表示柱子高度,计算下雨之后最多能接多少雨水 + + +``` +``` + + + + + + + + + + + From 21dfcedd7fab585e56d705a2a2b308d6c6562190 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 8 Dec 2021 03:49:19 +0800 Subject: [PATCH 148/151] update readme --- "2 List/\346\225\260\347\273\204.md" | 15 +++ ...53\346\233\274\347\274\226\347\240\201.md" | 8 +- 6 Sort/README.md | 5 +- ...50\346\200\201\350\247\204\345\210\222.md" | 115 +++++++++++++++++- 9 Algorithms Job Interview/README.md | 42 ++++++- README.md | 6 +- 6 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 "2 List/\346\225\260\347\273\204.md" diff --git "a/2 List/\346\225\260\347\273\204.md" "b/2 List/\346\225\260\347\273\204.md" new file mode 100644 index 0000000..f69c0b3 --- /dev/null +++ "b/2 List/\346\225\260\347\273\204.md" @@ -0,0 +1,15 @@ +# 数组 + +数据与链表差异 [参考这里](README.md) + + +## 循环数组 + + + + + + + + + diff --git "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" index 624b6a5..c35c115 100644 --- "a/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" +++ "b/4 Tree/huffman tree/\350\265\253\345\244\253\346\233\274\347\274\226\347\240\201.md" @@ -4,17 +4,21 @@ Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949 这是一个经典的压缩算法。通过`字符出现的频率`,`优先级`,`二叉树` 进行的压缩算法。 -对一个字符串,计算每个字符出现的次数,把这些字符放到优先队列(priority queue) -这这个priority queue转出二叉树 +对一个字符串,计算每个字符出现的次数, 把这些字符放到优先队列(priority queue); 这个priority queue转出二叉树 需要一个字符编码表来解码,通过二叉树建立huffman编码和解码的字典表 + +举一个例子: + 原始串: 二级制编码: huffman编码: + + ### 存储结构和基本操作 ``` diff --git a/6 Sort/README.md b/6 Sort/README.md index 1ad64c2..fd0ff97 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -145,6 +145,7 @@ void quicksort(int *a, int left, int right){ ```Java // pivot 选择 尾部节点, 代码写起来更加简单; 移动元素更方便 +// 左右指针技巧 static int partition(int[] nums, int left, int right){ int pivot = nums[right];//选尾部节点作为 pivot @@ -154,11 +155,11 @@ static int partition(int[] nums, int left, int right){ while (left < right) { if (nums[left] <= pivot) { - left ++ ; + left ++ ; //左边指针 窗口变小 continue; } - //元素比 pivot 大,右边窗口变小 + //元素比 pivot 大,右边指针 窗口变小 //swap left & right swap(nums, left, right); right--; diff --git "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" index 66d3522..d9d708e 100644 --- "a/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" +++ "b/8 Algorithms Analysis/\345\212\250\346\200\201\350\247\204\345\210\222.md" @@ -22,6 +22,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说: * Fibonacci数列 [代码参考这里 递归](./递归.md) +* 最大子数组和 * 凑零钱问题 * 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java) * 打家劫舍问题 : num[i] 代表第i个房子中的现金数目,从房子中取钱的最大数目,约束是相邻房子的钱不能同时取出 @@ -29,7 +30,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问 * 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。 * 最小编辑距离 * 最长递增子序列 (LIS Longest Increasing Subsequence),如`【5,6,7,3,2,8】` 最长子序列 `【5,6,7,8】`, 输出4 -* 最大子数组和 + * 最长公共子序列 (LIS Longest public Subsequence) * 最长回文子序列 (LIS Longest public Subsequence) * 0-1 背包问题 @@ -75,7 +76,7 @@ DP 和 回溯法 都会用到递归 基本步骤 * 划分问题 -* 状态 +* 状态定义, 穷举「状态」, bad case * 状态转移方程, 这一步最为困难 ; 暴力解法就是状态转移方程 * 状态压缩 @@ -94,13 +95,96 @@ for 状态1 in 状态1的所有取值: +## 最大子数组和 + +示例: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4],连续子数组 [4,-1,2,1] 的和最大, 输出:6 + + +dp[i] 表示 nums[i] 为结尾的「最大子数组和」; dp[n-1] 就是 nums 的「最大子数组和」 +状态转移 : `dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);` +状态压缩:注意到 dp[i] 仅仅和 dp[i-1] 的状态有关 + + +```Java +public static int largestSubSequenceSum2(int[] nums){ + + int n = nums.length; + if (n == 0) return 0; + + // base case + int dp_0 = nums[0]; + int dp_1 = 0; + int res = dp_0; + + for (int i = 1; i < n; i++) { + // dp[i] = max(nums[i], nums[i] + dp[i-1]) + dp_1 = Math.max(nums[i], nums[i] + dp_0); + dp_0 = dp_1; + + // 顺便计算最大的结果, 保存到 res + res = Math.max(res, dp_1); + } + + return res; + + } +``` + + ## 凑零钱问题 凑零钱问题[视频解读参考这里](https://www.ixigua.com/6881883015832666635?wid_try=1) -[实现代码这里](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/list) +[实现代码这里](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/framework/dynamic) 如果使用贪心策略,并不能得到最优解。 +比如:给定一个面值list : 1,2,4,5,7,10; 给定一个 target : 14, 求 凑齐 target=14 , 最少的零钱数量 + +思路: + +如想求 amount = 14 时的最少硬币数, + 如果你知道凑出 amount = 13 的最少硬币数(子问题), 再加 1 个 1元面值 即可 + 如果你知道凑出 amount = 12 的最少硬币数(子问题), 再加 1 个 2元面值 即可 + 如果你知道凑出 amount = 10 的最少硬币数(子问题), 再加 1 个 4元面值 即可 + 如果你知道凑出 amount = 9 的最少硬币数(子问题), 再加 1 个 5元面值 即可 + + +```Java +for (int coin : coins) { + // 计算子问题的结果 + int subProblem = dp(coins, amount - coin); + // 子问题无解则跳过 + if (subProblem == -1) continue; + + // 在子问题中选择最优解,然后加一 + res = Math.min(res, subProblem + 1); + } +``` + +通过备忘录消除子问题(不用递归了), dp 数组的定义:当目标金额为 i 时,至少需要 dp[i] 枚硬币凑出 +如想求 amount = 14 时的最少硬币数, dp[14] + dp[0] = 0 + dp[1] = 1 + dp[2] = 1个2元的,dp[1] + 1个1元 + ... + dp[9] = dp[8] + 1个1元, dp[7] + 1个2元, dp[5] + 1个4元, dp[4] + 1个5元,dp[2] + 1个7元 + 1 + dp[i-coin] 从这些可选项里选择最小的 + + +```Java +//对于 dp[i], 遍历可选项, 选择最小的 +for(int coin : coins) { + if (i < coin) { + continue; + } + + //dp[i] 保留最小的 + dp[i] = Math.min(dp[i],dp[i-coin] + 1 ) +} + +``` + +完整代码如下: ```Java @@ -134,8 +218,22 @@ for 状态1 in 状态1的所有取值: ## 股票问题 +num[i] 表示第 i 天的股票价格, 设计一个算法(交易策略) ,计算你能获得的最大收益,你最多可以完成 k 笔交易; + +比如: [3,2,6,5,1,3] +k=1 , 第2天买入 2块钱, 第3天卖出 6块,利润 6-2 = 4块 是最大利润 +k= 2 (可以交易2次) , [2,6] + [1,3] 是最大利润 + +动态规划思路如下: + + +* 状态定义: +* 状态转移: +* 状态压缩: + ``` + ``` @@ -144,6 +242,17 @@ for 状态1 in 状态1的所有取值: num[i]表示柱子高度,计算下雨之后最多能接多少雨水 +位置i能装多少? +位置 i 能达到的水柱高度和其左边的最高柱子、右边的最高柱子有关,我们分别称这两个柱子高度为 l_max 和 r_max;位置 i 最大的水柱高度就是 `min(l_max, r_max)` + + +思路: + +* 暴力解法 +* 备忘录解法 +* 双指针解法 + + ``` ``` diff --git a/9 Algorithms Job Interview/README.md b/9 Algorithms Job Interview/README.md index b2ce9c5..75d7a54 100644 --- a/9 Algorithms Job Interview/README.md +++ b/9 Algorithms Job Interview/README.md @@ -153,8 +153,44 @@ public static boolean hasCycle(LinkNode head) { ### 左右指针 -``` +快排中 挖坑(pivot) 排序 +```Java +// pivot 选择 尾部节点, 代码写起来更加简单; 移动元素更方便 +// 左右指针技巧 +static int partition(int[] nums, int left, int right){ + + int pivot = nums[right];//选尾部节点作为 pivot + int end = right; + + right--; + while (left < right) { + + if (nums[left] <= pivot) { + left ++ ; //左边指针 窗口变小 + continue; + } + + //元素比 pivot 大,右边指针 窗口变小 + //swap left & right + swap(nums, left, right); + right--; + + } + + // 跟 pivot 元素置换 + int i = 0; + if (nums[left] <= pivot) { + //swap left+1 & pivot + i = left +1; + } else {//swap left & pivot + i = left ; + } + + swap(nums, i, end); + + return i; + } ``` @@ -227,6 +263,10 @@ void mergeSort(int[] nums, int left, int right){ ``` +### 动态规划 DP + + + ## [字符串](1%20字符串.md) diff --git a/README.md b/README.md index a8e561b..6663323 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,9 @@ * 链表 * 双向链表 -### [数组](2%20List/README.md) +### [数组](2%20List/数组.md) -* [数组数列问题](%20Algorithms%20Job%20Interview/5%20数组数列问题.md) +* [数组数列问题](9%20Algorithms%20Job%20Interview/5%20数组数列问题.md) 数组和链表结构是基础结构,散列表、栈、队列、堆、树、图等等各种数据结构都基于数组和链表结构实现。 @@ -40,7 +40,7 @@ ### [字符串算法](1%20String/README.md) -* 子串查找 [字符串常见题目参考这里](%20Algorithms%20Job%20Interview/1%20字符串.md) +* 子串查找 [字符串常见题目参考这里](9%20Algorithms%20Job%20Interview/1%20字符串.md) * BF算法 * KMP算法 * BM算法 From 3cc2b2da1284a6c2dd6f1b693617143e8ddd60e9 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 8 Dec 2021 03:57:51 +0800 Subject: [PATCH 149/151] circle array --- "2 List/\346\225\260\347\273\204.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/2 List/\346\225\260\347\273\204.md" "b/2 List/\346\225\260\347\273\204.md" index f69c0b3..2be85e1 100644 --- "a/2 List/\346\225\260\347\273\204.md" +++ "b/2 List/\346\225\260\347\273\204.md" @@ -6,10 +6,24 @@ ## 循环数组 +特点 +* 长度固定,下表不会越界,使用2个指针标识 头尾 下标; 默认都是 0 +* 方便用来实现 栈,队列;比如 队列实现时,新增元素,头下表+1; 删除元素,尾下标+1 +比如Java的 ArrayBlockingQueue 就是一个 带有 takeIndex 和 putIndex 的环形数组。 +缺点:头尾之间的元素不好维护,从中间删除了某个元素,会出现数组空隙。 + + + + +数据结构 + +``` +``` + From 667624355cc6a5b7270604dbbb68d994bf6a1dee Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Wed, 22 Dec 2021 17:12:08 +0800 Subject: [PATCH 150/151] update list&tree --- 2 List/QPS Counter.md | 32 ++++++ "2 List/\346\225\260\347\273\204.md" | 1 - "4 Tree/8-\345\240\206/pq-1.png" | Bin 0 -> 107467 bytes "4 Tree/8-\345\240\206/\345\240\206.md" | 98 ++++++++++++++++-- ...1 \345\255\227\347\254\246\344\270\262.md" | 8 ++ ...6\344\270\262-\346\237\245\346\211\276.md" | 61 ++++++----- ...6\344\270\262-\344\277\256\346\224\271.md" | 33 +++--- ...6\344\270\262-\346\216\222\345\272\217.md" | 1 - ...0\345\210\227-\346\237\245\346\211\276.md" | 26 +++++ 9 Algorithms Job Interview/README.md | 3 + 10 files changed, 212 insertions(+), 51 deletions(-) create mode 100644 "4 Tree/8-\345\240\206/pq-1.png" diff --git a/2 List/QPS Counter.md b/2 List/QPS Counter.md index 3411dea..570c2c4 100644 --- a/2 List/QPS Counter.md +++ b/2 List/QPS Counter.md @@ -5,3 +5,35 @@ + +```Java + static AtomicInteger qpsCount = 100; //线程安全 + static volatile long lastSenconds = System.currentTimeMillis()/1000; + + //1 计数器 + public static boolean tryAcquire() { + + long current = System.currentTimeMillis()/1000; + if(current == lastSenconds){ + + if (qpsCount-- > 0) {//CAS api + return true; + } else { + //限流 + return false; + } + + } else{//下一个时间窗口 + lastSenconds = current; + qpsCount = 100; + return true; + } + } +``` + + + + + + + diff --git "a/2 List/\346\225\260\347\273\204.md" "b/2 List/\346\225\260\347\273\204.md" index 2be85e1..dc02027 100644 --- "a/2 List/\346\225\260\347\273\204.md" +++ "b/2 List/\346\225\260\347\273\204.md" @@ -18,7 +18,6 @@ - 数据结构 ``` diff --git "a/4 Tree/8-\345\240\206/pq-1.png" "b/4 Tree/8-\345\240\206/pq-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..78202ff57b2f97364198df85aaa15a6138319285 GIT binary patch literal 107467 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 pq = new PriorityQueue(); + pq.add(new Employee(1L, "AAA", LocalDate.now())); + pq.add(new Employee(4L, "BBB", LocalDate.now())); + pq.add(new Employee(3L, "DDD", LocalDate.now())); + pq.add(new Employee(7L, "GGG", LocalDate.now())); + pq.add(new Employee(2L, "CCC", LocalDate.now())); + + while (true) { + Employee head = pq.poll(); + System.out.println(head); + if (head == null) { + return; + } + } + } + +``` + +输出 + +``` +Employee [id=1, name=AAA, dob=2021-12-22] +Employee [id=2, name=CCC, dob=2021-12-22] +Employee [id=3, name=DDD, dob=2021-12-22] +Employee [id=4, name=BBB, dob=2021-12-22] +Employee [id=7, name=GGG, dob=2021-12-22] +``` + + +如下,使用 PriorityQueue实现的 top-K 大问题,实现如下: + +```Java +/** + * 小根堆实现 + */ + public static int findMaxK(int[] nums, int k) { + PriorityQueue pq = new PriorityQueue<>(k, (a, b) -> (a-b) ); + + for (int i = 0; i +``` ## 判断字符串是否是回文 diff --git "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" index 7618a01..dc80de2 100644 --- "a/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/1.1 \345\255\227\347\254\246\344\270\262-\346\237\245\346\211\276.md" @@ -27,11 +27,14 @@ char char_first_appear_once(const unsigned char *source){ int hash[256]={0}; char *tmp = source; if (tmp == NULL) return '\0'; + + //第一次建立hash表 key为字符,value为出现次数 while(*tmp != '\0'){ hash[*tmp]++; tmp++; } + //第二次扫描找到第一个value为1的key tmp = source; while(*tmp != '\0'){ if (hash[*tmp] == 1) return *tmp; @@ -151,30 +154,6 @@ int lengthOfLongestSubstring(string s) { - -## 最长公共子串问题 - -请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 - -例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 - -``` -int longest_common_subsequence(const char *s1,const char *s2, char *common) -``` - -分析:求最长公共子串(Longest Common Subsequence,LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。如"abccade","dgcadde"的最大子串为"cad" - - - -实例代码: - -``` -int longest_common_subsequence(const char *s1,const char *s2, char *common){ - -} -``` - - ## 对称子字符串的最大长度 (最长回文子串) 题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 @@ -228,6 +207,40 @@ int max_symmetrical_char_length(const char *scr){ ``` +## 最小覆盖子串 + +(难度 hard) `滑动窗口` + +给定 字符串 s, t ; 在字符串 s 里找出 包含 t 所有字母的最小子串 +eg: s = "ADOBECODEBANC" t = "ABC" 输出: "BANC" + + + + + + +## 最长公共子串问题 + +请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 + +例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 + +``` +int longest_common_subsequence(const char *s1,const char *s2, char *common) +``` + +分析:求最长公共子串(Longest Common Subsequence,LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。如"abccade","dgcadde"的最大子串为"cad" + + + +实例代码: + +``` +int longest_common_subsequence(const char *s1,const char *s2, char *common){ + +} +``` + ## 求最大连续递增数字子串 diff --git "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" index 4b18a11..0fcf775 100644 --- "a/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" +++ "b/9 Algorithms Job Interview/1.3 \345\255\227\347\254\246\344\270\262-\344\277\256\346\224\271.md" @@ -79,22 +79,6 @@ char *revert_by_word(char *source){ 用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 -## 左旋转字符串 - ->字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 - -如把`字符串abcdef`左旋转2位得到`字符串cdefab` 。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 - -``` -char *left_rotate(char *str,int offset){ - -} -``` - -思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了。 -也就是跟上面的问题是同样的问题。 - - ## 替换空格 @@ -138,6 +122,23 @@ char *replace_blank(char *source){ ``` +## 左旋转字符串 + +>字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 + +如把`字符串abcdef`左旋转2位得到`字符串cdefab` 。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 + +``` +char *left_rotate(char *str,int offset){ + +} +``` + +思路: 我们可以abcdef分成两部分,ab和cdef,内部逆序以后,整体再次逆序,就可以得到想要的结果了。 +也就是跟上面的问题是同样的问题。 + + + ## 字符串原地压缩 diff --git "a/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" "b/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" index 9dd1338..9bc9900 100644 --- "a/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" +++ "b/9 Algorithms Job Interview/1.4 \345\255\227\347\254\246\344\270\262-\346\216\222\345\272\217.md" @@ -2,7 +2,6 @@ - ## 小写字母排在大写字母的前面 有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在大写字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型: diff --git "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" index ac9bd9b..24cf68b 100644 --- "a/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" +++ "b/9 Algorithms Job Interview/5.4 \346\225\260\345\210\227-\346\237\245\346\211\276.md" @@ -119,6 +119,32 @@ int topK(int * a, int length, int k) +```Java +/** + * 小根堆实现 + */ + public static int findMaxK(int[] nums, int k) { + PriorityQueue pq = new PriorityQueue<>(k, (a, b) -> (a-b) ); + + for (int i = 0; i window = new HashMap(); + while (right < s.length) { Character c = s[right]; From f19caf3ac6bb76bc67c9d2447fdc9f21ad11bf98 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Thu, 23 Dec 2021 11:59:12 +0800 Subject: [PATCH 151/151] priorityqueue update --- "4 Tree/8-\345\240\206/pq-1.jpg" | Bin 0 -> 128833 bytes "4 Tree/8-\345\240\206/\345\240\206.md" | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 "4 Tree/8-\345\240\206/pq-1.jpg" diff --git "a/4 Tree/8-\345\240\206/pq-1.jpg" "b/4 Tree/8-\345\240\206/pq-1.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..e8b9cebd45c2b7647e8e36b97a20c3c9c7d0ecdb GIT binary patch literal 128833 zcmeFZcT`i~w=cSBQl$w}B`6>Y0!mduLXjq76qPDO1*C&WixLv)od_z}AksucKp=qB zNLP`LAVDBSMFk`QiCa>5`};fRojcxrW4v+R9dF!!-fty4StD6{?LF68vwh}Vd;8Ni z8IU|>>tGA;@BqLy=ml(3fNUF7AXIa50<-`C5CQ~vqyavt#sj?o9z{UlUv&UD#iR6J zb!VOf|JjBY0MY^h{{L*_0e$~dp#J_j`#-<=p7Q*U9-s35pRM^{J>~nax&_o4*j@#W zo(%|(3Xcp3zpiSadl)!s<>18sPw!CqS6$;@RmrJ6*|RvHf&a&C;Rh?A6=wSlASJ|a z!T*YnXCJ^T#lt7Xv)u>4pt}&@`B(YZY0w7`FCV|a4nZMd5mBf?lO({)!^g+V&nF=8 z&t-Vxq5lDXDFNxdM=W>jI(J2IUxbW)LSBiGnpJ(btn)Zs-QentL}8KLa`Fm_8v8X5 z9Mm#2GB!DS?6~zw8(TYjhg0V-Ty$}DbNBG^^}FUD5Ev906&(|cx_K)pIVCkMJtH&! z?!Eg3g%2J+DlIFocvktm>P15%p{cp$b!%HsZ(skw;M;faCnl#pPS1RrB~hrfFJHec zegE;3vA*$pllceyyY&xU(0Kj_SIt~wE8(<4$Z37u)J=k@v?~6={rfp!{(Mte`+y>|wC|B-n5|+!`zYX+_Zv#Sw zDcJ8jE4KmiAtc)=O6IH}{D1xt_J2KT#?t2BJ^g!}{=EwR%`JWZmIeQonZUnS!M`;p zWK8^97W`Wl{C~X)u-jvt&vZOHv(1E)w2J-hJY#uj8%W*;zFZt9uE2t~fzpCD5#T^+ z=Kp_=X9{YrZV&I7CSG*-k}_bwhmnV`F~2Qxp!9#~fNzig?;K%m#^W>FKw=g8A|pJ@ z>>MRL72fF5PV=ESS$QhW61=Wb*M>w7)t_81S2XN$E&9@Wb`Z4ZC(o=5WAhIV5}x!ywycl!I6Jr!)MVZV5ma1KWKc-8z`_gl;(0zvv)O`R&w~Y$ zXT;*iGdruL{c`k|0@R{`w&;CVK73XVT{n>;2g^w+pW(PM=ia1H1$X#b78b+ z3*F*O^7M9K9whwrI#igOGXv3*B{%8e59@Y`09Oe^D5gVYFG)m^7!@9L;d#OA9 zUN(LHVX{^E>CoW)4C0ty*1M5Ef4_e2h$7Ft!zh7C&|U54yf9O%1R*cYZyQMA%7Nyd z_LEK>3>jhLnp(qC(w@^QXll-3gSG()iENlS4_Nx_)h0X=M4aFX3s$B`h_} z^p;Tpjv-Cbd~E+Q>g)QdQBM8 zWx8Wa7yoiuuDWh;PfpSDyt_wyUUo3^wcn>X-#dH?Rt{h2hk3S&kaBthc#;s8ltVuY zYG5hnbCg!g`jN9He_8&sC%X{Lw8u=?CUO6$UTnzHqrbJJKU|Ufi~&=4#)8NcdoR7L z=TTPw%}UfYu3_u6`sAfF1mT@g%1`x)zQ`Op`H2ip_EX)eFar$@#Tg{?=5fdi_heA& zR(Z@6`q zgGlikTT@GXr@Ox(LNYE-XTVof?dZAn+k&!NI&>Tbwz^DNOm8!8VnouKanw+ypJ16&le($MI&X?h#W7*O;$_utX!?jOu4o+>*ZKbxaVnR(F zi@)4VoFMn_>Hj=d{flIU5R=TqX&FU%O8_c0(Gc^&!Ai;y9CTpEv2;*>Ea>?O>TMrV z$>rB+=2v$8Xr?FR+WvT>)`>~Pj1mczJqS{G_uv3l#3;PkCTvKSlhSijZVNr4uhyER z8F*QI#(BI;d@w{guD$eBj&kN6Wm&%~cPz{U3ZWs*b#QTW+nVX&t; z=FhFuFpcuimzPdF?#s&-a0_=fy$4)1iqA@Z`&44_k@kij6XcYb>#=3Q8kQLtOerRE za-M-peJ#f^M2SzUx?QuOd#3LzK3jgEfqGS_pWSz^D`aVJ#8#k%fb8Ew)&cGqUXH7Q z`GhA3_7IgIrAjiFqucx*`)&;LAtbE?v@}==7Kup>>q=RCs9hp@2NO6A+dv3Xk}WyY zafFT_SEiLQ()t&bX)JB0$NNbm^Ydk%S+{ExLVx8-#g=LftlR&rN(DGTDRG|>LKIrW z$PS&-A=)NmG@-*WGEkxYZuc}(^4I+fVTWxFylU~ks~jrl_~eRLt^reSC75*~U>j({ z_29tMv{&4IhIn2S37Kw~*xxl2ub4Wo5OOT_;@-R0-xs}gIN$(mO=q%)I62q=1cZUf z5`!d2rj!{RB$HMV5-8C=gHPbC(Uq8jZQyE)lkJuO!dOVH;F674@I$Y;uOl}c;I^1K zxU^XyJ&Wnd_|q4j_6WyBq!T<%-9y67(!vawfrsdgt2f6fM7 z!!kx+o-$gTh4sLdFnY@eHF{BgO`UNU^W~pf+!0oPSco)G01{iAtQ;UEAEBOi6cF?XbPleK}7(;6`ysc8vwBQFaNx z8_l~7$aE=!ILhZ+3ni2R#tytu`bWc7v-bA$2L`~o$;MjSFB&%t^8VhZ;7EncD$av0 zBhZulXO+;Vmu_Z4tLiV#pv8;t4Ofm0`I+E~QW=DKY|RpS0^_ydJ8DP##=0VA~x z4PNQQzOk--(CTMQsuz95iVgGYp!N&#jxO~c-ghGT8NeF2ZAN2WpxdnqQgF$I+rZ9k zATZ}tuXp>TZf#VNrc1-?ykDC;WnG6dgIiRk40x@Y(en>B;3!d({>3J{m43P_Gm5TT zL|YR4llYb9&9(Te7lo#zMHmBZHI&35Dt8gm&z+a0|GyKTt>_td%;%Byj z#;&4hmPLP!7yG1773W33`Tm9hi{f*^8-cA2N3$-QB4C3f0en7W{K`ix>qc+`I7yM& zVDAMlmMwHXnSjXzsi-nEerF}R*zfPiS8{e0hl=hGK|x1cCEVtrZ;de*w!t zsMJmj2TEjSJM9}f+@L`iXYOh~B5%fEqrVYd;pAdPTsE9C-z7E0))YHlmqD9kpWAPljucevLf+(JjkdG0`1PUA!9vyqt_xJo>#8~5tA6MX&B4MC)j|gbuqy($4mE^UzMdmA&k4eTI{W-+k@qqMY=soHRz{_HNXiQ4&{PlknkRC85h zLr09W{bjfQP$_ufW$T$U?GS+PgiM3e5n0%|f$-TZtMCLltO$jUB2M+c0IQ;tUfd)G zVNE}<6b(($A6B|YKKnlc*3h0Wxr@azoaby&mVpDy%Kg$PEp#`_&FM1Az~N-m?sK18 zv*-T$zD2Hln*XM25_NQG0qsM_b43IxFrnpQZ7eAg(dH%R)IN2Z@697;1)G;n2Q3zj z=jS4xDEpVxWp}B~VLtaVIiM3PU6(5d%gCX`yM5R9(5-_kz^zYzT^CRt;`pGA=D+P` zuUt(H7P{KNLVrl3n!?1*T+lZ0bQ?lRX%IYYcW@o2oWvEp2W24c?m!G6T3!cFxu?XQ$+I9E@e=I;^f;+?o@kYqN2gDE!H9D`M-Wd z4fgaiFbg$2olAE}pO4iOR5Jn>S-aTU^x6dKHXs}bT~O!6D5Wk_Q3RFL!#y}|6zV-e z`uH0)w|e&H!QdP9LR6`{YHh1&T7#1BSVRjDR_VYBmk$`{x9j_lJ~*;+gNLIuBgc>%Tu=nv$xd-plWbj^XE~HP z;Z4zZN9VuxR5Yuqhvkh($yFZ{Ic5aXSSPq2#@MGhrCrBRYHnZ&!-#D{Z+9D8Ay~sQ zHT9hiF%TN0d4sa@cHayOk*eE$ikpjb8@+hK;J`MZjPfVX+~&#!VKl)j72Y1f-Wn*Q zI42dj+Fdbq*x}V1m#P7=0DHk&Z1)MaE6a*~k&ejV9z_Rz^jFl(jn1fJ z@1^|k!6{yQ*vXA5y!@bd|HZwoSB-7H@vuHmo8Y#A03@l}lT&AA$1-5=XawVB6a`aO z&Fp82b(1dWGTx8b?Gvnj-5vTzV$)L?6D1yCT zKwR}Oozx?mqwjQM(Nfam;Y;^g^YKWT=U;sz~>*7-@<53e2LyXWIwcwAhm1 zWAb$CK-8@@JwBkuEWAWOCZMYaKBsQ>u2LWwt{N>r$0TqW-8BgD!(hJ-U?8yG-HEOS*_#^*P88qf4Z z%sNF&Ja~BWwVasGvF`b#iQA^c+t{YjJ|`F%*;}K|<^{{ByZk68q(3k3o-Sy#eEwji zhC(1qe zeDHo*_KQN*Ftwu!bxmEuC{Nl<%H?UhLFAqv7~_1(>fGtOPUDmIyVDcc6jfKO!Oa7f znqNur0eth9j@Syt)C&sMO86j)Ad8p}GLuTPRCM8ip;C`$xROO?+kgi0E7F!7&%m$l zB7+2DkcYm8024IkKIgdWZKfOMUCT>nC*~MP7<|xC-D^2V@K;z`ssp`X^mBS!CU6NX zCD7kOkbO`BJP^)NuFZhJyAvta@Hg84c;K<^NjRZ7T?x8Ujv4mw;`@$T>>QFg)C>-X z(|M7%A4xKrrn95LmspB+@<0@QP2uk7?3big`B0tq-22N&dK;Wviu@ghQP~E1CPr?X zvnN!ibO?{NL%qLvBW=Q^y)J19^-aFuQBMGPteejOZ$`9fqu>F-K^+9yWMz~JlSFx} zd%|}I=g)mt*%OQjGhal5Izrv%zAnp$vTkGi_&Q@2dDu5uXHo5*A8Rlt(0Y?-zGriD zwp-D|xvk;VMpIwujE0`Rrx(6RKUKN^_dZJ%196AgHW0KX2C@d>igj$K>Yv3h@Nr#W zo6r9CSQ(dB9u+Ug<;%paj&}^FUQ)gsBg4azp!+y6rt|2JdlX~)IJQon{o?^l>|Egu zEp3PAhNouuq+UFewmK`h!$PnIZNR9bY4(ZMfd@=_un7yIj0+@K>hF2+r9Sh+8R|JY zzxH0cUz&=>9U3=spLkG2xspjmZkenf7q#GpV+iigNAEwy)(}yMDm|1jAZabFd~@M^cAL)lVNx<1#gnE^mZKEgu# z25}c;sLa-p{omkoAwT|G1s&J3+gzdbBS!PbD{qH@iMxgomq_~BH}jA7CJ8Gktv&eJ@L&A6BiXm)bBh~?$d+nIv1#mbT)+jevmxWcq24i!AuhblZ ztgH?x!&|zAK{}y~{V$6ziPPtW*gw>K!XvbIt`Ix3vv~~$y|#h(-YdkF`z>5t{%!ch z;CEd8phfxL;lll~bW_U-GaKrzIBAE#nuQZNFJ|vYswZ9$i>>D8iFm6y(WL|?u+E^} zI7QgdISD~_XlL_X@?u}R{UNpvR<>=fw;b7L^{Uw0{lW15+1XEZh3fh_nYl^7*KfnM z%(XGo_~y#)&e%5#N(@{N#C)QQ>9D44aN0-h101Sv@u0ysA1RcKf z=G-N&)C3~8&IfuAL6TdBF_Uesgc1tm{9pO~y&AgMo5*(ak!^phrGIZ7H1Qoa!v6{XEJI2{*(mh!OTv zw*}cv+5S36A5^ddr}b`M+v%>u3|P-!0)IzBlRaS`=90>EJWLyLQwg5+aX;m|*H24a zU#M<)R1B>S+K_SCkTXFhf*A}5N+rU~4E(C*QE8_>66!^77AzaqUqa|ql1^SJQ95@r zN#r)Z5cd>*ZPlNumkilJkV|aN1L2R7=!-Nx5mb10!K0L9%zmQhY{9qhKW-3`2W5`@ zLK5s>Scx6%e)r{e{9l&EPmgCgbUEsox{~?f%AYRgk~3i;zg9o@8+G;>8<;r{{Iu3C zyZ!#n7fGQyWlloJc`9C!`xY+_UBSy^!)v-p$@E>=rs&^d>bDqH^!uut$_1g%Wo;1v z&zS2&?i5xO8_25TLAx-FA2Z&Q2D?`&oEtyP4x^R)OluO|Pfd7W10LVM_fS&*?}GQ& z`8(p;U)E-CuxNVS_)nwVFoHz7x$#^eUd-&6k8T+}iAa%Y$d9W=tvy4oeBZQtz0ol@ zi;Yz-_C8mxd?nICYxS88k1OBi zUw&|Y-19leBGME*W&0@tWD(spdAR#_(IYh1pTTT+T=- z9X(`ID%I2syuGl##cS{#-#7|Q6y6n2K&%S*G4^2ry`-0$Cxp>5(K;>*O1oQ7VZ)1` z)Pqyp&!e(FXbmT|932L*7W&I=rvh7U5n|7M_H-LmZ!{CvAno&7F?YT>H=<4PQsRo7 zW0|3{5I7e)_c1O0%)r$i)5ma8f7RH%-u~1x<{^*%+j@h0R&U-uy^Ypm`C-O9u(%F8G7bl8 zEXPV2u4N!4YR%fc%r|;(y}ad8R(XlIbyDB<-B-0&NAIw^qTFrOU)o?O^d+{84+R4F z(|*q_N~7R|B=4FN<xHmjY!W0+WKk9l=78(ukxH{Qy2s%F^mbI-Kg-H!n)rohO(P zwI&VbgyGM$Oh;+g8145oy&2}Wcj=RXDCKMJ(7Oxfo-OD7T@l!z0qM`HIkfM=T-4WwtdlY~YLm5)S$d!U%Q!#4J2P(PUK!BL|vN>@vLH z!%TbIj8+M|#r^kIyl%_gZ_gXxf}^O*S% zFU~Ps)R!_`Nme-345>FD^quI@5HV$X+Q{Z-yj@{3od5sPY@c9h(@ z=U@`0C3$nzJDh<0>7nxYX0-7~g#OLdvV2=o!iBJFngC!5Db_fem=z4%$4S()CXWiW zP`3(-2mj9e#CGHUsx1g?1NFg>OFUu!oNwa!|BDdo_Qe0zkmBDIP7d53kpYKsb{`e+Fm+R>F=iXs%*p9k+PYQueiYPnU72T; zkr92k+(+9$KT>=fxbg`#xLROu^s@$nG3f(tPe;iait?)ApU4jPF9VILVL5qs5a1!-!*krX z9`T)RhtAnhR}V@_3S7L{+yNyN1LA<})*uoOqdTu9K&lKI0GpkjdxIAuAXis!z@^=g zO?9Nz5Jsq&$$_qd#-fyI?S3@q&fUg$B!Hi7fnOpoerw9}QNKQXz&9A={7TNmhSten2M z$GJrZ_%b1TW7x6Ej;^Q%ijTYvg7xop`q`)2SM*%2#| ztau5dFh2d(?vMG0LsY5ILHXHiS2)WCElyutRielCA%)QA)I2?xuj|dOshwSSU$CHh z#-%vhuIXNM9?I)9*>7dT( zgZ{8(nLRTXrXk(fslRnZr)e>>PW6$of`oEiW%WU(YMyrv>j?KfTm|jNviZ!NMK;Sf z)H6;?8WGdXj`;0E?0%4=bTa#!NrAfk)!6kiY5Q*uith49|F*4x2MSj<8A-HSBHiT= z#XEu1B9YwTV8ng37(yVhbQ<4X>t;lo?LVE4Pw#Enb4&r?m;gKpZ)Cx@`1MB$@Rc*$ zz~{?#vu*4lI;-|ZZs1RE+c<$yK#UF<4F9BiCGZM5 zJ2c=o#q5QIm_M!)Q^B1y7oZpR;b&P?!K9AJ2-$+HxToIlBI6FfcUN*7?u+%sP7>;0 zF49HVInd19!lN@v5|K0_yd?t0a%YFCUxu%4DS1ScMp@jGG#xpAw7&wFpWty9!_kzputaIF+t(0uV z=7x!Pbtw4RsMLwgrOO-X**VI3V(St|O7rcrozVOrP$1aS|8vOeU7kpcu& z_(Kcx?4{E}F7~whWiIM_ihXk*zY+=|b08>ye}z*(DB3X{PMRCw9%%yeAZstZU@fYx zznak8e0JXW2Q8=kLgbAPU6=aGF)ow5rMLUvn9XrT9!u}go&F6&0RyLx#9Lj%mGI0U+aOA%d~;eb zCn17*|NcvxO6H-R5b#-2#P02)$)EPY*w;P(CwR2j03X245@~Dw!@*S9@;@Fsnxri& zP?_J>Cjy%?q*CwWI1!W~wkGeEm!=Mhi6xd3OZ=m9>}Ml*KHJ zkWj(!^^-AMMTFBMd8YUM+~q#x2|jps%qLPgSyu>vkdb5)t_U<+){8w7EXH%}dP58R z^60EJ4ZA|2E@m!3il!P2K37OJ+AMfhkGc_DnW_EyYi9xZ!7m-10(GA#UjF$WGL6st zW+3Yv6l--@(K&B1jlHJrIUg-p@Q2yf5%FV9m4-TJ_*SMEOIuReWFl62V_D~ex?t0r zqom>?>+z=G!1oZHjvF z+1xmTtVZ3Dz+`>@eWrbZY!UyrZN5x{MJ?wp(># z8F8o0_i~`I^~3HYfoqnGFY2hQ-u%;fPRbK9fw|N9#-SUw`!n6L8VuU>L%z1+NPG}@ z2+ip<=QPbzNzU8C*@3boxal@8kVEp?t5f+H1ht) zw8c)m{OAh^3GLp!`epo2#%OX>`r@@n=1n8dsMkN{-s<5)X4F`FK}W8LK?KVLwVOsx z%f{?>1NVEG+fCGL%7-g5H3GjH=yc-{d15`0``M=G*>6N!qW@^3Nes4rG=|K8qzWHniS+Iq-GzZ|| zL2Q4xV4KkgIw`0{PpKdeT)OY8_Nz1JA2x(F^_`mVkd z^~Gwuu=}9F!Ic2MQQ}pJ-Q1}*{}r3iXKYh2o>COvVl<7;pVa#V7^l z7?(uVsMm$d)EIqek<%B-;~Um2Iw-Q^`rL&BZveU;cra~iahAq?&rD*Iy1sy$bpKum zDd<5+qcs?pMg8kM49{Ik7H7uVThDzS5LQ6>UA(Su0$iXwVGx*cqCDH36?O^qKhL?3 zQ3>|erw?{7%8i!1!;NLk4pILR!C&sW3$?9PgCn!U_JNCJQLPS1P}VJRMSjj z2n=NUH875<pV(Fw9Q_i&ofo9 zs_rF503FE5GnYr3(PO*A`Pp9d;umc?MYT9zc=OAJpG=J0KEpeA)z|Cy%D^7JGCeE! z5o6SvIojQ}Io~ZRqv-b~7hzE)nvdO!Ovlm@ohHmp7?kLeRtYM^(wi5%Cl`L=e7m%q zF8#b_8LM^X5@~Om|D&2lLDO3s$arY&TXByEF76;gwv|+%OT$C7D{aWV;|OKm99I03 zx^xb)&t1)CNQ&QC?k)e#RKuUkcpuKaF6mLa0h9$H(KGb*0&(0h9nuxD_F8Qzb4DLO zIUi4mFubh-*>3C<5Esn4ft&k7G4xjL0531@QtH{NAM+!4d9rvy(A8^Z-hv3i-#PSr zvD;kH!!@KA+7aTz#3#5k6>alcns=Z;P5}>WB?CuB+0^ zpQs#Gd{(ftPcOqTb}HN$Foe>umv zsOEaZgV7H~hxgvEK+!L@nS2jt@6w;9*>F-YiaXtRKGWHJ+;HtLw2ZvBP+v6aQv!-E zsXVqnp-m&s)eS5Pv*j2*cATeB7C>g5-r#fRxs#3bk#yI-n63V@qsaQvP^pL@rI?j4 zrO|^5_c8#%28li35-ly8Z4L1}i!qa+V=mWyll(B+w9~P>Z9QmbrJLFKz@3m#^8;^Q zU%U8FU$lR(g21{C8bdcp!TPl0XGftRYpQA-atB(g<8gQKzC1PEEff$-hvh$$rpkW>BB7AYO5*a4qiIx`+}4xPSI;CeN* zlwVkU<;5Y>h7$Gs!Bqi9e)wF=zz|CbGa`2lO7jeCX$5m=aemTnq#w+Q41tRBa{EpfryKsLr`8ttxpBik%S`oq=cY}~J$ zeEpaMzqfvaOXoCU&wkojMVCCYe9I%Z-v|fK znl)d%R98@m`Fb@u0tT7;fhX*kCud#~ePN_;Hsdu>sQ$_XbPVI~ar3$|>vhk;NY%eO zUlWW=u9>j-h7Oa95OZuE)cDknN|DaTu=e&WA5{UycuXYo|XyO2jZg-w zU9ArLACg>--N+P|5th9Cz%C~lOX-E(7+uD@b};mc9|upKKOEG;*ik%y zFn4?87W1adyN8v#XUyjbE*eas){&N-=%Ir+^J8oqI${Odcq!y9zjW7X(w|{mBS*Sq zo97rAWj>_Tc=#;CQk8$n9IuIjF$tU}zoDSbV79qVkP7@&xDXO;NEi>@eCK>ccBEv_ zNb#@=zh~0@j8E*R*8}(>xgtEQi|-f)P>8iMagMy$j}sRCYna5TqhfdN$5(j%RV;e> zx|r;B>g>D5tLU_-?COCV@T(XV?Artip2hbG`#rhtE#ztzuo zQk_DdUe&pGCQa*Iu=?GHB2Q?e1s9cNZPbhyYb%i~7gR8LpooE_;8NM9)!-khU3!-` zn7?5|uTA4w)TwuLOX=^Ql-M^tWfr1n{rb6czj304ARes`nG#ZHVTN2kJ{j9=oEEyf zj%>P79iZ4hT~cMK+e)cs$7g$X2S+N7MoRUx^*tO~T^fo}nP;hUhp>(QtH*+=SSWp) z32nPgwtk}%E63hj_~#L`p^#KjJE5NMWE*>lQo1;wSML#HVou?))%RKw0FOns?nEWm`)zt7Z&qQYDLQr zah3A~LQ=4)5E5G1^T|w*{A#znwRg}~=fc$MDP1O)`Hix50J!36>SG~jRu6zID9!g? zTL7HtpbkNhbC14tX|O}VL6#hMIueDW>9)sHu?cY5+OpIUuAcx}`&N>$NO{oiqqIu} zB0R;g1@?xGYN&%zye1UlOKkrB=eWjdSBV%*_)D(4j-PuTY&EiZ+E<+~?R?T~+Vi?G zd^S-CEytLnG`G-O2B+~s6GrWkyY$IU;ri_HOICe*8m-93m8J3$Me>CN%RS~jk)GCZ zeulBT|46;8cibhIYyWwNiwl3M3%{ggw=5XS67j~&Omii{CwPFcm{wT42fnMrDomZ> zH(d!u@zz((-embJ*9Q(oA(rCg+`n7 zMt9`G`HP6O&XAeTfKjbJIVW9TibUaX@a<`=8y zQTr#9=b*Xx_|uywo0IKAgNha{Q zg1h1LS{fohI7_MKM1P-a!`q>+-qvEt0{735+s|AVw;Wu_*lT%B70`G1E&yP>FpCB? zGXt<$m9MhneqdSUQFp1b>x#kpd}_e^-q)&nTy){OQU-)T$C8W%yU)8qVc)N2ESrll?M_5#S@OdkK9A} zVIWjM9o4luVrqNqcip&~`7X9m6POjjxUtyl5rWZgtM@Vv4ZM5~#eC79C^v{Ew=DRH zl;6Jy@V(y#eDSk$cAP@4;CHO(ii&BC4Igs3a6D1qSM?2N9SJDM=E=-k zIqZ62yBO8%cDw?WUkZ0B?Hhj0xaxc77cFV-AEj*Qdq6~^KH0M>!&LV>i zGzKanL&KHNdk-rfa!~*ELebUj<5`1ztJ{LSx8cVBiqx*VLQ;;U?cvJ3M{)l*{kq23hY!*z!$gpid9x7ZA9n5fL@9mQ6G|pcP8j9H2k;loTnwHy> zqVg2xDI$_;2L2)@S8v0QqOD|!!F8Xa=#gY2j^W_G&RB{jyJC=r<=o}yZ38ynn>Ji; zqtzH?%u+B-Zg6q7|GYhYrW+xsmt-y%B?65$>Uw7X z1*XKOYAQ0Z!-wUHn(T)us(v&RW!VNDH&juXMjK$pZORsVeG7;`6t6yDQ?xZo?Z*w* zd9!`f-@y*>Y@K7-W8by2A^fIZuMfTzUQFDB5rML}U03(APGE*%JZvOG@N67s-#6O% zsSb&fH{sOIjIdvq_FSwP>r8xcy+#fI8hQqq#*=IQq&84BuO@vkaV9KOUN&EC~q2Knk zgkwz?>{ml;PcBQgG`*I5k(PdWMeIoS>QNfpABMx%pWZGbQ*Q^&CpuXqtSju(ses{ zQq+S@rRDVBPAb6)*9s9?A6`qjo9$kAFwhdXwEq&BH<*gR!3lONcUg|$4lEBFL5KC3 z4!Q2sxc>zsLG+wI{v}&@^_o=kptA3cTys|!XPfvndMuQw=gRoG(`AX0S`quazx17$ zYffy%Vql6Q`Itp@e0bRCot*sJ35yB}^$b&H0;oa1_TFs?0CBsFq{-P48it}liMozH~Q+mJZ)W&{m*PJ=((@|6` zJ<9t^>7L5#@A2B7(0&Xe4aSx^qT3~j`LJbNMv+J^{56d^2xh&s3SD3hnfenZOGZ40 zFI9^bUY_$?mu&v^n3~4k^$eRjTE=$aq;5X!5M+q|LiX}nQ8av~noy`x+ ztmA4Hf5bLZbVI+zrOXO$z1t^Up7K_ySu7J+gI|uziVOcVO40s&Do^|S^?`~{2lUh@ zw4RSTf3V=I(&QzYa}7YpL2P4X4{;7LNR&Qwbux;WrPyCnm;A)5+u*0@bElhpSC1Ag z7~AiczJEtMbm!pv2&M{-b(jm$)PP8hLMpOPPy2V`y1Op4nb**Yu6d68=+sNwaqzyU zJO;Jk!-{irH%sbUG-WreG_&C3^2J@NU3=%h|7mkw`9uF$TW2U5{5?Ao)#8<*;2bGT zd76=W>@)ALthJ#7*?gK5*A(+ZmH#fk1#+zQBjJTP5 zCH`ξ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�qN|GJI+bRyZaJHTM!>a2c-R9 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 Rm(3IX-zvecpZoL3{{z)7>`wpy literal 0 HcmV?d00001 diff --git "a/4 Tree/8-\345\240\206/\345\240\206.md" "b/4 Tree/8-\345\240\206/\345\240\206.md" index c490690..c6e8d6e 100644 --- "a/4 Tree/8-\345\240\206/\345\240\206.md" +++ "b/4 Tree/8-\345\240\206/\345\240\206.md" @@ -16,7 +16,7 @@ 比如小根堆存储示例 -![小根堆](./pq-1.png) +![小根堆](./pq-1.jpg)