11 2020 档案

摘要:经典动态规划:背包问题 本文题为《背包问题九讲》,从属于《动态规划的思考艺术》系列。这系列文章的第一版于 2007 年下半年使用 EmacsMuse 制作,以 HTML 格式发布到网上,转载众多,有一定影响力。2011 年 9 月,本系列文章由原作者用$LATEX$重新制作并全面修订,您现在看到的是 阅读全文
posted @ 2020-11-30 13:28 箐茗 阅读(398) 评论(0) 推荐(0)
摘要:大端和小端的定义 大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内。 小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。 【热知识】 机器读取内存数据时,是从低位地址到高位地址进行读取。 一般来说,栈分配的方向是从高地址向低地址分配,但在变量内部地址是从低地址向高地址 阅读全文
posted @ 2020-11-29 16:58 箐茗 阅读(911) 评论(0) 推荐(0)
摘要:数学基础:向量叉乘 详情点击数学基础之向量点乘与叉乘 判断线段相交 常用的方法是通过向量叉乘来判断,这种方法不需要算出直线方程(再判断交点有否),在代码实现上比较简便。用这种方法判别线段是否相交一般分为两步: 1. 快速排斥实验 2. 跨立实验 Part1:快速排斥实验 首先判断两条线段在$x$以及 阅读全文
posted @ 2020-11-29 16:26 箐茗 阅读(5044) 评论(0) 推荐(3)
摘要:向量点乘 向量点乘又称为内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。 公式 对于向量$\vec a = [a_1, a_2, \dots, a_n]$和向量$\vec b = [b_1, b_2, \dots, b_n]$,有 几何意义 阅读全文
posted @ 2020-11-29 15:53 箐茗 阅读(2599) 评论(0) 推荐(0)
摘要:循环(loop) 指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。 迭代(iterate) 指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。 本质:利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步 阅读全文
posted @ 2020-11-29 15:05 箐茗 阅读(523) 评论(0) 推荐(0)
摘要:搜索算法 搜索算法有很多种类型,一般来说就是深度优先搜索,广度优先搜索,A*搜索,IDA*搜索这四种类型的搜索,而本篇讲述的就是其中最核心,最简单的搜索深度优先搜索和广度优先搜索。 DFS算法简述 深度优先搜索是一种适用于树形结构的搜索,它和数据结构栈紧密相连。对于这种算法而言,它的主要步骤大致如下 阅读全文
posted @ 2020-11-29 12:51 箐茗 阅读(1208) 评论(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 箐茗 阅读(599) 评论(0) 推荐(0)
摘要:两数之和 暴力解法 解题思路: 两个for循环嵌套,暴力枚举两个数字。 时间复杂度:$O(n^2)$ 空间复杂度:$O(1)$ for循环+二分查找 时间复杂度:$O(nlogn)$ 空间复杂度:$O(1)$ for循环+哈希函数 时间复杂度:$O(n)$ 空间复杂度:$O(n)$ 双指针法 左右端 阅读全文
posted @ 2020-11-28 18:36 箐茗 阅读(64) 评论(0) 推荐(0)
摘要:关于单调栈的基本性质和简单应用在线性表小结之队列与栈已经做了比较详细介绍,这里主要针对单调栈在实际解决问题中的应用进行补充例举与总结。 逛街 解题思路 从左往右(1~n)单调递减入栈,依次记录栈中元素个数(ans[]),在从右往左(n~1)单调递减入栈,依次累加栈中元素个数(ans[]),最后依次输 阅读全文
posted @ 2020-11-28 15:00 箐茗 阅读(107) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、非比较排序 基本思想 桶排序也是分配排序的一种,但其是基于比较排序的,这也是与基数排序最大的区别所在。 桶排序也是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序算法想法类似于散列表。首先要假设待排序的元素输入符合某种均匀分布,例 阅读全文
posted @ 2020-11-14 17:08 箐茗 阅读(271) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、非比较排序 基本思想 基数排序也是非比较类线性排序算法,对每一位进行排序,从最低位开始排序,复杂度为$O(kn)$,为数组长度,$k$为数组中的数的最大的位数; 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级 阅读全文
posted @ 2020-11-14 16:53 箐茗 阅读(973) 评论(0) 推荐(0)
摘要:标签 稳定排序、非原地排序、非比较排序 基本思想 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出,它的优势在于对较小范围内的整数排序。它的复杂度为$Ο(n + k)$(其中$k$是待排序数的范围),快于任何比较排序算法,缺点就是非常消耗空间。很明显, 阅读全文
posted @ 2020-11-14 16:43 箐茗 阅读(144) 评论(0) 推荐(0)
摘要:标签 非稳定排序、原地排序、比较排序 基本思想 直接选择排序中,第一次选择经过了$n - 1$次比较,只是从排序码序列中选出了一个最小的排序码,而没有保存其他中间比较结果。所以后一趟排序时又要重复许多比较操作,降低了效率。J. Willioms和Floyd在1964年提出了堆排序方法,避免这一缺点。 阅读全文
posted @ 2020-11-14 16:28 箐茗 阅读(179) 评论(0) 推荐(0)
摘要:标签 非稳定排序、原地排序、比较排序 基本思想 冒泡排序是在相邻的两个记录进行比较和交换,每次交换只能上移或下移一个位置,导致总的比较与移动次数较多。快速排序是目前应用最广泛的排序算法之一。快速排序又称分区交换排序,是对冒泡排序的改进,快速排序采用的思想是分治思想。 每次从待排序区间选取一个元素(一 阅读全文
posted @ 2020-11-14 16:14 箐茗 阅读(158) 评论(0) 推荐(0)
摘要:标签 非稳定排序、原地排序、比较排序 基本思想 希尔排序是希尔(Donald Shell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是直接插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破$O(n^2)$的第一批算法之一。它与插入排序的不同之处在于,它会 阅读全文
posted @ 2020-11-14 16:04 箐茗 阅读(191) 评论(0) 推荐(0)
摘要:可变参数 可变参数即表示参数的个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等。printf(),sprintf()等函数的实现就使用了可变参数,可变参数还可以用来对任意数量的数据进行求和、求平均值,非常方便(不然就用数组或每种写个重载 阅读全文
posted @ 2020-11-14 00:20 箐茗 阅读(1539) 评论(0) 推荐(1)
摘要:数组传参 数组作为参数传给函数时传的是指针而不是数组本身,那个指针存储的是数组的首地址,如:fun(char[8])和fun(char[])都等价于fun(char *)。 //在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。//如果想在函数内知道数组的大小, 可以在 阅读全文
posted @ 2020-11-13 16:14 箐茗 阅读(3572) 评论(0) 推荐(1)
摘要:基础知识 (待补充) typedef struct和struct(C和C++中的使用) typedef struct OLNode { int i,j; int data; OLNode *right,*down; }OLNode,*OLink; //结构的对象OLNode, 指向结构的指针*OLi 阅读全文
posted @ 2020-11-13 15:17 箐茗 阅读(678) 评论(0) 推荐(0)
摘要:指针 什么是指针 假设有语句 int a = 10; 那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000;那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10。 现在定义:int *p;p = &a; 阅读全文
posted @ 2020-11-13 14:01 箐茗 阅读(54) 评论(0) 推荐(0)
摘要:后缀名 由于历史原因,在很久以前,C++的源文件的后缀名也是 *.c,但这样会引起不少的问题。于是不同的前辈就想了不同的方法来解决这个问题:就是把C++文件的后缀名改为了 *.cc *.cpp *.cxx等等。 到了如今,基本上除了Unix系统外,其他的平台上,C++文件的后缀名基本上都是 *.cp 阅读全文
posted @ 2020-11-13 01:47 箐茗 阅读(1105) 评论(1) 推荐(1)
摘要:C语言指针数组(数组每个元素都是指针)详解 C语言二维数组指针(指向二维数组的指针)详解 int **指针与二维数组问题 1)定义二维数组方法: int matrix[ROWS][COLUMNS]; //定义一个二维数组,其中ROWS和COLUMNS为常数 2)加入有如下声明的子函数: void p 阅读全文
posted @ 2020-11-12 16:55 箐茗 阅读(1436) 评论(0) 推荐(0)
摘要:size_t存在的意义 三个字: 跨平台 代码解释 size_t = typeof(sizeof(X)) 简而言之 不同平台的size_t会用不同的类型实现,使用size_t而非int或unsigned可以写出扩展性(可移植性)更好的代码。 为什么要加“_t”? _t的意思显然就是type。一个类型 阅读全文
posted @ 2020-11-12 16:02 箐茗 阅读(328) 评论(0) 推荐(0)
摘要:算法背景 迷宫问题和棋盘马走日问题都是搜索问题(找路径),一般采用DFS和BFS两种搜索算法都可以,如果要求是最短路径,则一般BFS解题,DFS则需要记录所有的可能路径,找到最短的那条。一般来说,迷宫问题的前进方向为四个(上下左右),障碍物直接用1和0来判断。而马走日则有特殊的障碍物判断规则,前进方 阅读全文
posted @ 2020-11-10 17:53 箐茗 阅读(1728) 评论(0) 推荐(0)
摘要:螺旋矩阵 方形矩阵 问题描述 给定一个$N \times N$的方阵,其中元素为自然数,排列规则为按照顺时针螺旋方向单调递增(起始值为$1$,终点值为$N$)。举例如下: 若n = 3,螺旋矩阵为: 1 2 3 8 9 4 7 6 5 若n = 4,螺旋矩阵为: 1 2 3 4 12 13 14 5 阅读全文
posted @ 2020-11-09 17:26 箐茗 阅读(503) 评论(0) 推荐(0)
摘要:数组的静态分配与动态分配 栈区与堆区 例如:int a[10] vs int* a = new int[10] (1)int a[10]使用简单,系统会自动实现内存的分配和回收。int* a=new int[10]需要判断内存是否分配成功,以及在不用时需要使用delete[] a进行内存释放,否则会 阅读全文
posted @ 2020-11-07 21:08 箐茗 阅读(152) 评论(0) 推荐(0)
摘要:概念 质数,又名素数,是只能被1或者自身整除的自然数(不包括1)。 判断是否是质数最直观和简单的方法就是从2开始直接除,能除尽(余数为0)就不是质数。 整数的唯一分解定理 任何一个大于$1$的自然数N,如果N不为质数,都可以唯一分解成有限个质数的乘积:$N = P1^{a1} * P2^{a2} * 阅读全文
posted @ 2020-11-07 20:55 箐茗 阅读(683) 评论(0) 推荐(0)
摘要:变量 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。按作用域分: 全局变量在整个工程文件内都有效; 静态全局变量只在定义它的文件内有效; 静态局部变量只在定义它的函数内有效,只是程 阅读全文
posted @ 2020-11-07 20:36 箐茗 阅读(1316) 评论(0) 推荐(0)
摘要:GOOGLE的C++代码规范 在线:英文版 中文版 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》下载 阅读全文
posted @ 2020-11-07 20:26 箐茗 阅读(68) 评论(0) 推荐(0)
摘要:字符串查找 strchr,strrchr与strstr 功能:对字符串中的单个字符进行查找。 //strchr 函数原型的一般格式 char *strchr(const char *str, int c); 它表示在字符串str中查找字符,返回字符c第一次在字符串str中出现的位置,如果未找到字符c 阅读全文
posted @ 2020-11-07 20:13 箐茗 阅读(246) 评论(0) 推荐(0)
摘要:sizeof 是在汇编里面就存在的一个指令,可以直接返回要判断的变量所占的内存大小(字节数),这是在编译器(编译阶段)就确定的。 返回值类型是size_t,该类型保证能容纳可以建立的最大对象的字节大小,在头文件 stddef.h 中定义。这是一个依赖编译系统的值,32位系统一般为: typedef 阅读全文
posted @ 2020-11-07 20:12 箐茗 阅读(379) 评论(0) 推荐(0)
摘要:测试平台g++ 5.4.0和VS2015社区版。 输入输出原理简述 程序的输入都建有一个缓冲区,即输入缓冲区。当一次键盘输入结束时,输入的数据会被自动存入输入缓冲区中等待处理。 相对应的,程序的输出也建有一个缓冲区,即输出缓冲区。 cin和cout C++提供了两个用于处理输入和输出的预定义对象ci 阅读全文
posted @ 2020-11-07 20:10 箐茗 阅读(1069) 评论(0) 推荐(0)
摘要:简单四则运算之逆波兰式解法 前提:数字为单个0~9,只有四则运算符,不含括号优先级(数字和优先级均可拓展) 易错点 1. 字符串读取 不含空格:整行读取 开辟char数组,以字符串形式 %s 读取,以空白符为分割; 含有空格:单个字符逐个读取 开辟char字符, %c 读取; 【注意 %c 的读取不 阅读全文
posted @ 2020-11-07 12:16 箐茗 阅读(245) 评论(0) 推荐(0)