数据结构学习记录
记录数据结构学习过程,参考《大话数据结构》和尚硅谷的《Java数据结构与算法》课程
小小小楚楚
不学控制枉少年
展开
-
KMP算法
转载:KMP算法详述原创 2020-10-05 12:05:18 · 37 阅读 · 0 评论 -
哈希表实现
哈希表实现 哈希表实现实际上是一种存储方式,也是一种查找方法。查找过程中多了一步查找的运算(取余等),缩小了查找的范围 哈希表有很多种实现方法,直接定址法,除留取余法再散列函数法,链地址法等等 尚硅谷的实现方法中采用的是链地址法 复现之 package hashtab; public class HashTabDemo { public static void main(String[] args) { Employee emp1 = new Employee(7, "xiaochuchu");原创 2020-09-15 20:42:24 · 286 阅读 · 0 评论 -
斐波那契查找
斐波那契查找 个人理解 一个很神奇的算法 前提:有序序列 之前我们的二分查找法,是和中间值比较的。那? 可不可以比较个别的呢? 比如,性感的黄金比例分割点? 正好研究数学的那群人又研究了个很神奇的数列 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765…] 它有这样的规律: F(k)=F(k-1)+F(k-2) 然后相邻的两个呢,又是基本符合黄金比例的(怎么样,惊不惊喜,我也不明白咋回原创 2020-09-12 22:14:45 · 76 阅读 · 0 评论 -
插入排序
插入排序 个人理解 前提:有序序列 插入排序算法即线性插值的算法,假设有序序列是线性的,那么我们依照坐标直线的等效插值算得依照线性方法得到的下标位置,那么就可得到一个最接近的下标值。 当然越接近线性排序的,查找的速度就越快。反之,像{1,2,3,2000,2001,2002,2003…}这种,就不是很适合。 实现之 package search; public class InsertValueSearch { public static void main(String[] args) { i原创 2020-09-12 09:39:25 · 93 阅读 · 0 评论 -
线性查找
线性查找 个人理解 线性查找算法,就是依次遍历,找到对应的值即返回 小技巧 可以通过在查询的尽头设置哨兵的方法来避免越界判断 实现之 package search; public class LinerSearch { public static void main(String[] args) { int arr[]= {0,1,2,3,4,5,6,7,8,9}; System.out.printf("查找结果是%d",linerSearch(arr, 7)); System.out原创 2020-09-12 09:01:06 · 241 阅读 · 0 评论 -
二分查找java实现
二分查找 个人理解 对于一个有序的序列来说,先取到最中间的值。然后目标值小于他那就左边找,大于他就右边找。 递归方法实现之 package search; public class BinarySearch { public static void main(String[] args) { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }; System.out.pr原创 2020-09-11 23:20:15 · 96 阅读 · 0 评论 -
基数排序
基数排序 个人理解 基数排序的话是像分类一样,先分好1,2,3,4…, 接着先对个位数排序,然后十位数排序,依次对位数更高的排序 这样巧妙的一个点在于每次排序之后的低位都是有序的,然后当位数取余为0的时候(没有对应的高位),那么直接取出它就是对应的顺序了 以下转载自基数排序 上面这幅图,或许你已经在其他的博客里见到过。这是一个很好的引导跟说明。在基数排序里,我们需要一个很大的二维数组,二维数组的大小是 (10 * n)。10 代表的是我们每个元素的每一位都有 10 种可能,也就是 10 进制数。在上图中,原创 2020-09-03 19:16:00 · 96 阅读 · 0 评论 -
归并排序
归并排序算法 个人理解 分治算法,虽然目前还不太理解,不过味道大概嗅到了一些 先一半一半的分开,然后到了 最小的不可分割的原子层面,进行比较,按顺序交换,这样就达到了最小分组层面的有序 然后往上回溯,回溯的时候呢,往上找,两个最小分组进行排序,只不过因为原本的数组已经有序了,我们可以放心的从左往右遍历。因此我们新开辟一份空间,搞一个数组,依次从左往右遍历两个最小分组,谁小复制谁即可。复制完成以后再重新拷贝回原本的数组空间即可。 ...原创 2020-09-02 18:46:53 · 72 阅读 · 0 评论 -
快速排序
快速排序 快速排序,看名字就毫不谦虚 快速排序是对冒泡排序的一种升级,应该是目前最快的排序算法 具体方法为 选取数组第一个数23为基准数,存入temp变量中,从数组的左右两边界向中间进行遍历,定义两个指针 i 和 j,i 最开始指向数组的第一个元素,j 最开始指向数组的最后一个元素。指针 i 从左向右移动,指针 j 从右向左移动。先移动 j 指针(从右忘左移),当 j 指向的数大于基准数时,略过,j 继续往左移动,直到遇到小于等于基准数的数arr[j],将arr[j]填入arr[i]中;再移动 i 指针,当原创 2020-08-30 17:12:10 · 83 阅读 · 0 评论 -
希尔排序
希尔排序 个人理解 希尔排序是在插入排序的基础上的一个改进 插入排序的缺点在于因为他的遍历方向比较单一,这样可能导致原本只需要动一个数据的操作然后移动了很多个.例如像 {2,3,4,5,6,7,8,9,1}这个数组 希尔排序通过先简单的随机两两排序一下以后先让序列趋向于有序状态,然后再进行插入排序 ...原创 2020-08-29 12:15:14 · 121 阅读 · 0 评论 -
插入排序
插入排序算法 个人理解 就像军训时候排队,前面有人按照大小个排队了,自己从头到尾找到自己位置,插进去,后面人们自动往后移一个位置. 好像打麻将一样,这个算法假定你拿了一手麻将,从左到右要整牌. 于是你从第一张开始,整第二张牌.如果比第一张牌大就放后面,比第一张小就放前面看到第三张,你看比第一张小,那你就放在第一张的位置上,否则再和第二张比,以此类推 实现之 尚硅谷的教程中是往后移动一个然后插进去看看,不行再插一个,个人理解好像可以找到排序的插入点后再后移或许更好理解一些 package sort;原创 2020-08-26 17:24:44 · 102 阅读 · 0 评论 -
选择排序算法
选择排序 个人理解 选择排序即选择最值的排序,一圈一圈的遍历,每次都遍历出最值来放到头或者尾部 代码写之 为了方便理解和高效书写,我们先写好内圈循环(参考了尚硅谷的讲课) int min; //最小值 int minIndex;//最小值对应的索引 min=arr[0]; minIndex=0; for (int j = 0; j < arr.length; j++) { if (min>arr[j]) { min=arr[j];原创 2020-08-26 13:44:31 · 83 阅读 · 0 评论 -
冒泡排序及其优化
冒泡排序 冒泡排序算是个经典的排序算法了 它的理念很简单: 一次一次的遍历需要排序的序列,把轻的冒泡出去,把重的落下来 具体做法为: 如果从小到大,每次两两比较,大的放在后面,小的放前面(像极了我们军训时候排队的样子).从大到小也是这样 写之: ...原创 2020-08-24 23:15:12 · 71 阅读 · 0 评论 -
八皇后问题
关于八皇后问题的思考 看到这个问题,又看到了尚硅谷的代码,对于这些算法是怎么搞出来的开始进行进一步的思考 我目前认为可以这样理解: 其实可以以第一视角去试玩 我放了第一个棋子到第一行, 发现可以放,于是我放第二个,放到第一列, 发现不行,然后放第二列,发现又不行,那我放第三列,发现可以了, 那就接着放第四行.也可以,那我继续, 就这样放到了第八列,发现,第一个,不行.那第二个,第二个可以,那第三个.依次尝试完以后.那第七行再换个子试试? 待会用代码实现一下 ...原创 2020-08-19 15:56:24 · 102 阅读 · 0 评论 -
有关迷宫回溯问题的思考
有关迷宫回溯问题的思考 目前刚刚学到这个题目,还没有看算法讲解,先写下自己第一时间的思考 这个问题如果我来做, 首先用二维矩阵来模拟一个迷宫,0表示可以走,1表示不可以走,绘出迷宫轮廓 问题在于怎么走出迷宫, 目前的思路是这样的: 首先我会规定好它的遍历策略,先往哪个方向看,再往哪个方向看,有路就走,走不通再说. 这样肯定会导致一些问题,比如走的路是死胡同的情况,那怎么处理? 或许可以说记录一下走过的路,走的路是死路了,那我标记一下此路不通.但是在哪里标记,我又怎么判断我走的这条路不通的? 走不通的判断方原创 2020-08-14 15:20:24 · 108 阅读 · 0 评论 -
中缀表达式转后缀表达式
重温数据结构 第一次写技术博客,最近在重新学习数据结构,做一些记录 中缀表达式转后缀表达式思考: 中缀表达式特点: 运算符两边肯定对应两个数字 从左到右计算 运算符之间存在优先级 括号视为特殊的运算符,左括号作为最高优先级,右括号作为结束标识 为什么采用栈的结构? 私认为运算表达式具有的特点: 从左至右进行计算 中间处理的结果会成为下一次运行的操作数 这也就意味着,我扫描过程中的结果有时候需要及时算出来好进行下一步的运算,符合后进先出的特点,因此采用栈结构 ...原创 2020-08-10 15:32:44 · 107 阅读 · 0 评论