随笔分类 -  数据结构与算法

摘要:KMP算法 一. 应用场景 给定原字符串A, 查找字符串A中是否包含字符串B. 例如: 在字符串A"aassddaassffaa"中查找是否包含字符串B"aassf" ? 二. KMP算法 核心思想: 略 (去百度,不会写),不过该算法很牛啊, 佩服佩服!. 三. 代码实现 // 第一步:求模式字符 阅读全文
posted @ 2020-12-26 21:32 殷大侠 阅读(153) 评论(0) 推荐(0) 编辑
摘要:任何比较排序算法的时间复杂度的上限为O(NlogN), 不存在比o(nlgN)更少的比较排序算法。如果想要在时间复杂度上超过O(NlogN)的时间复杂度,肯定需要加入其它条件。计数排序就加入了限制条件,从而使时间复杂度为O(N). 计数排序的核心思想(来自算法导论):计数排序要求待排序的n个元素的大 阅读全文
posted @ 2019-05-11 19:30 殷大侠 阅读(3560) 评论(0) 推荐(0) 编辑
摘要:快速排序是分治思想的又一典型代表,是应用最广的排序算法。分治思想就是把原问题的解分解为两个或多个子问题解,求解出子问题的解之后再构造出原问题的解。 在快速排序算法中,它的思想是把一个待排序的数组分成前半部分和后半部分,并且要求前半部分的值都大于等于或都小于等于后半部分的解, 当前半部分与后半部分都变 阅读全文
posted @ 2019-05-10 22:29 殷大侠 阅读(8768) 评论(0) 推荐(0) 编辑
摘要:我们利用最大堆可以实现数组从小到大的原址排序,利用最小堆的可以实现对数组从大到小的原址排序。 1 二叉堆的简单介绍: 最大堆与最小堆可以当作通过数组来实现的一个完全二叉树,除了最底层之外其它层都是满的,并且最底层也是从左到右填充的。在最大堆中,父结点的值大于或等于子结点的值;在最小堆中,父结点的值小 阅读全文
posted @ 2019-05-09 22:18 殷大侠 阅读(3593) 评论(0) 推荐(0) 编辑
摘要:归并排序是典型分治思想的代表——首先把原问题分解为两个或多个子问题,然后求解子问题的解,最后使用子问题的解来构造出原问题的解。 对于归并排序,给定一个待排序的数组,首先把该数组划分为两个子数组,然后对子数组进行排序(递归调用归并排序),最后对两个有序的子数组进行合并,使合并之后的数组为有序状态。 让 阅读全文
posted @ 2019-05-09 21:16 殷大侠 阅读(17139) 评论(0) 推荐(0) 编辑
摘要:冒泡排序 冒泡排序是我们大多数人接触到的第一种排序算法,原理简单易懂,不多解释。说明三点: 1. 冒泡排序是稳定排序,只有当两个元素不同时才会交换; 2. 冒泡排序是原址排序,不需要借助额外的空间; 3. 冒泡排序通常见到的都是通过循环来实现的,其实通过递归来实现更简洁。 4. 冒泡排序的时间复杂度 阅读全文
posted @ 2019-05-09 00:12 殷大侠 阅读(12929) 评论(0) 推荐(0) 编辑
摘要:对于二叉树的三种遍历方法, 递归方法实现起来简单,明白。但是效率不好,并且不安全,可能会栈溢出。循环的实现,肯定是基于栈的数据结构来实现,要复杂一些。代码如下: 前序遍历的实现: 中序遍历的实现: 后序遍历的实现: 最后,补充一个宽度优先遍历的实现,即一层层地遍历: 分层遍历: 阅读全文
posted @ 2019-04-07 23:36 殷大侠 阅读(3719) 评论(0) 推荐(1) 编辑
摘要:二分法查找 适用于有序线性表中,之前吧,我对于这个二分法查找很头疼啊,一想就头疼。直到看到下面这种很容易明白的实现方法。 下面的程序中,把左右端点放到待查找的序列的两端的外面,不包含自身。这样很容易明白与实现,还是直接看代码比较明白。 bool find(const int& element, const int* array, const int k) { //K表示数组中的元素... 阅读全文
posted @ 2018-05-11 12:06 殷大侠 阅读(872) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示