随笔分类 -  算法基础

计算机编程常用基础算法讲解与例题汇总
摘要:概述 一般排序算法的应用背景为顺序表,最大的特点就是可以随机访问,即根据数组下标访问相应的数组元素。而链表是无法随机访问的,每一个结点都需要从头遍历去访问,这就使得利用下标来实现排序的一般算法在面对链表时,需要进行针对性的修改。同时,区别于只存储值的一般数组,结点的存储结构要复杂得多(数据域、指针域 阅读全文
posted @ 2021-01-21 21:53 箐茗 阅读(2472) 评论(0) 推荐(0)
摘要:基础知识 矩阵乘法 一张图说明足矣: 代码实现(C) const int N = 100; int c[N][N]; void multi(int a[][N], int b[][N], int n) { memset(c, 0, sizeof c); for(int i = 1; i <= n; 阅读全文
posted @ 2021-01-03 12:01 箐茗 阅读(974) 评论(0) 推荐(0)
摘要:斐波那契数列 斐波那契数列指的是这样一个数列: $0, 1, 2, 3, 5, 8, 13, 21...$ 后面的每一个数是前面紧邻的两个数之和。 $$F(n) = \begin{cases} 0, &n = 0 \\ 1, &n = 1 \\ F_{n-1} + F_{n-2} &n \ge 2\ 阅读全文
posted @ 2021-01-02 22:42 箐茗 阅读(2542) 评论(0) 推荐(0)
摘要:泽勒一致性是由克里斯汀·泽勒开发的用于计算某天是星期几的算法。这个公式是:$$h = (q + 26 * (m + 1) / 10 + k + k / 4 + j / 4 + 5 * j) mod 7$$ ​ 其中: <1> $h$是一个星期中的某一天($0$为星期六,$1$为星期天,$2$为星期一 阅读全文
posted @ 2020-12-27 15:41 箐茗 阅读(739) 评论(0) 推荐(0)
摘要:概念 二分查找,又称折半查找。 基本思想:减小查找序列的长度,分而治之地进行关键字的查找。 前提:该序列必须是有序的。 查找过程:在有序表中,取中间的记录作为比较关键字,若给目标值与中间记录的关键字相等,则查找成功;若目标值小于中间记录的关键字,则在中间记录的左半区间继续查找;若目标值大于中间记录的 阅读全文
posted @ 2020-12-26 12:47 箐茗 阅读(3440) 评论(1) 推荐(1)
摘要:排序算法(Sort Algorithm) 给定一个$n$个元素的线性表$(a_0, a_1, \dots, a_{n- 1})$,排序算法返回重新排序的结果$(A_0, A-1, \dots, A_{n - 1})$,满足$A_0<=A_1<=\dots<=A_{n - 1}$。这里的小于等于号可以 阅读全文
posted @ 2020-12-08 17:56 箐茗 阅读(141) 评论(0) 推荐(0)
摘要:标签 非稳定排序、原地排序、比较排序 基本思想 每趟从线性表的待排区域选取关键字最小的元素,将其放到已排序区域的最后。因为每趟可以让待排序域的元素数量减少一个,所以总共需要$n - 1$趟操作就可以将整个线性表排序完成。 堆优化 在每次查找关键字最小的元素时,可以使用堆对效率进行优化,使用对来优化的 阅读全文
posted @ 2020-12-08 17:54 箐茗 阅读(312) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、比较排序 基本思想 归并排序属于比较类非线性时间排序,号称比较类排序中性能最佳者,在数据中应用中较广。 归并排序是分治策略的一个典型的应用。所谓分治策略(Divide and Conquer),即将问题分(divide)成一些小的问题以期递归求解,而治(conquer)的 阅读全文
posted @ 2020-12-08 17:53 箐茗 阅读(718) 评论(0) 推荐(0)
摘要:标签 稳定排序、原地排序、比较排序 基本思想 与插入排序不同,冒泡排序是一种基于交换的排序算法。基于交换的排序,是指根据线性表中两个元素关键字的比较结果来对换这两个元素在序列中的位置。 假如待排序线性表的长度为$n$,从前往后两两比较相邻元素的关键字,若$a_{i - 1} > a_i$,则交换它们 阅读全文
posted @ 2020-12-08 17:52 箐茗 阅读(313) 评论(0) 推荐(0)
摘要:标签 稳定排序、原地排序、比较排序 基本思想 直接插入排序是一种非常直观的排序算法,它的基本思想是将线性表分为已排序的前半部分和待排序的后半部分,从待排序部分选出第一个元素,插入到已排序部分的对应位置中,直到全部记录都插入到已排序部分中。通常来讲,我们不会真正的首先判断插入位置,再进行移动,而是边移 阅读全文
posted @ 2020-12-08 17:51 箐茗 阅读(1153) 评论(0) 推荐(0)
摘要:经典动态规划:背包问题 本文题为《背包问题九讲》,从属于《动态规划的思考艺术》系列。这系列文章的第一版于 2007 年下半年使用 EmacsMuse 制作,以 HTML 格式发布到网上,转载众多,有一定影响力。2011 年 9 月,本系列文章由原作者用$LATEX$重新制作并全面修订,您现在看到的是 阅读全文
posted @ 2020-11-30 13:28 箐茗 阅读(420) 评论(0) 推荐(0)
摘要:数学基础:向量叉乘 详情点击数学基础之向量点乘与叉乘 判断线段相交 常用的方法是通过向量叉乘来判断,这种方法不需要算出直线方程(再判断交点有否),在代码实现上比较简便。用这种方法判别线段是否相交一般分为两步: 1. 快速排斥实验 2. 跨立实验 Part1:快速排斥实验 首先判断两条线段在$x$以及 阅读全文
posted @ 2020-11-29 16:26 箐茗 阅读(5188) 评论(0) 推荐(3)
摘要:循环(loop) 指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。 迭代(iterate) 指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。 本质:利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步 阅读全文
posted @ 2020-11-29 15:05 箐茗 阅读(575) 评论(0) 推荐(0)
摘要:搜索算法 搜索算法有很多种类型,一般来说就是深度优先搜索,广度优先搜索,A*搜索,IDA*搜索这四种类型的搜索,而本篇讲述的就是其中最核心,最简单的搜索深度优先搜索和广度优先搜索。 DFS算法简述 深度优先搜索是一种适用于树形结构的搜索,它和数据结构栈紧密相连。对于这种算法而言,它的主要步骤大致如下 阅读全文
posted @ 2020-11-29 12:51 箐茗 阅读(1240) 评论(0) 推荐(0)
摘要:应用场景 在迷宫、棋盘等问题中,经常需要使用方向数组。 一般的“寻路”类问题都可以使用方向数组来编程求解。 示例 #include <iostream> using namespace std; int dirx[4] = {-1, 0 , 1, 0}; //x direct int diry[4] 阅读全文
posted @ 2020-11-28 19:29 箐茗 阅读(627) 评论(0) 推荐(0)
摘要:两数之和 暴力解法 解题思路: 两个for循环嵌套,暴力枚举两个数字。 时间复杂度:$O(n^2)$ 空间复杂度:$O(1)$ for循环+二分查找 时间复杂度:$O(nlogn)$ 空间复杂度:$O(1)$ for循环+哈希函数 时间复杂度:$O(n)$ 空间复杂度:$O(n)$ 双指针法 左右端 阅读全文
posted @ 2020-11-28 18:36 箐茗 阅读(75) 评论(0) 推荐(0)
摘要:关于单调栈的基本性质和简单应用在线性表小结之队列与栈已经做了比较详细介绍,这里主要针对单调栈在实际解决问题中的应用进行补充例举与总结。 逛街 解题思路 从左往右(1~n)单调递减入栈,依次记录栈中元素个数(ans[]),在从右往左(n~1)单调递减入栈,依次累加栈中元素个数(ans[]),最后依次输 阅读全文
posted @ 2020-11-28 15:00 箐茗 阅读(118) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、非比较排序 基本思想 桶排序也是分配排序的一种,但其是基于比较排序的,这也是与基数排序最大的区别所在。 桶排序也是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序算法想法类似于散列表。首先要假设待排序的元素输入符合某种均匀分布,例 阅读全文
posted @ 2020-11-14 17:08 箐茗 阅读(291) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、非比较排序 基本思想 基数排序也是非比较类线性排序算法,对每一位进行排序,从最低位开始排序,复杂度为$O(kn)$,为数组长度,$k$为数组中的数的最大的位数; 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级 阅读全文
posted @ 2020-11-14 16:53 箐茗 阅读(1001) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、非比较排序 基本思想 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出,它的优势在于对较小范围内的整数排序。它的复杂度为$Ο(n + k)$(其中$k$是待排序数的范围),快于任何比较排序算法,缺点就是非常消耗空间。很明显, 阅读全文
posted @ 2020-11-14 16:43 箐茗 阅读(162) 评论(0) 推荐(0)