编程的50种基础算法代码,编程常用算法有哪些

1、哈希表(散列表)
hash_map基于hash table(哈希表)。哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。它以键和值组成的对为基础。
统计字符在字符串出现的次数,或是否在某字符串中出现等等这类问题可以用哈希表来处理。
当字符是8位时,可以建立一个长度为256的哈希表(形式是数组),数组的下标是字符对应的ASCII码,数组的值可以是出现的次数,或者是否出现的布尔型变量。
2、合并排序(merge sort)
基于分治法,把排序问题拆分成自问题。分治策略的基本思想就是对于一个问题规模为N的问题,将其划分为规模足够小的K个子问题,子问题由于规模足够小可以直接求解,最后将规模足够小的K的问题的解合并得出原问题的解。
比如把序列分成若干几部分,分别排序,然后再将已经排好序的子序列进行合并。
3、高位数乘法karatsuba
ab*cd=10.^(n)*ac+10.^(n/2)*(ad+bc)+bd
其中,ad+bc=(a+b)*(c+d)-ac-bd,这样使得较小位数的乘法由四次降到了三次
4、变量关键字volatile
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。这个关键词在嵌入式系统中经常用到。
它适用于变量随时可能会有变化的情况。
5、二维递增数组的查找问题
数组中的每一行按照从左到右递增的顺序,每一列按照从上到下递增的顺序。
当一直以右上角或左下角为开始查找的位置时,问题得到了简化。
以右上角为例,这个位置的元素是该列最小的以及该行最大的。当要查找的数大于该元素时,删除该行;当要查找的数小于该元素时,删除该列;当要查找的数等于该元素时,已查找到,结束查找。
6、约瑟夫环问题
在一间房间总共有n个人(下标0~n-1),只能有最后一个人活命。
按照如下规则去杀人:
所有人围成一圈顺时针报数,每次报到q的人将被杀掉被杀掉的人将从房间内被移走然后从被杀掉的下一个人重新报数,继续报q,再清除,直到剩余一人
传统做法是用链表做,并将链表的尾与首相连。
第二种方法是转换成一个递归问题,即找出规律。
f(n,m)=[f(n-1,m)+m]%n,n>1
重点考虑的一点是要把杀死第q个人之后,剩下人的位置发生了变化。这个变化规律理解清就好了。
0 1 2 3 4 5 ...... n-1 总共n人设第q个人也就是下标为q-1的那位,
杀死:剩下n-1个人,如下:q q+1 q+2 ...... n-2 n-1 0 1 2 ...... q-2 (这里是除去q-1这位兄台的剩余n-1人)
这时,又来重复我们的老套路:将新的被杀的后一个人作为新的0号,
于是新的如下:0 1 2 ...... .......... ........ n-2
新旧顺序号的关系如下:old = (new + q) % n ,new= (old + q) % n
7、c++中class成员变量初始化与在类中的声明顺序有关
long long int 是64 位的
在编程之前,一定要把容易忽略的边界条件和特殊输入想清楚。
8、动态空间 用new指令,该空间使用结束后一定要用delete指令,防止内存泄漏。
9、C++的函数最多只能有一个返回值,而脚本语言matlab(用function),python(用def)的函数的返回值不受限。
10、函数传递的方式有按值传递,指针传递,引用传递三种。按值传递,它只是将参数做了备份,无法修改函数之外的外部变量,所以这个不是很常用;
引用传递在声明时要加&
引用传递的本质:一块堆内存空间可以同时被多个栈内存空间所指向,不同的栈可以修改同一块堆内存的空间。
11、图像压缩编码常用的Z字形扫描(Zigzag Scan)
在图像进行Z变换后,大系数集中在左上角(低频分量),其余的零系数比较多,这样扫描编码会大大节省比特数,提高效率
而且高频分量去掉一部分后,只是损失了部分图像细节。
仔细分析可以发现它对应了四种情况:
(1)row=0且col+row=偶数,或者row=n-1且col+row=奇数;col++(水平向右)
(2) col=0且col+row=奇数,或者col=n-1且col+row=偶数; row++(竖直向下)
(3)col+row=奇数,col--,row++,(向左下角移动)
(4)col+row=偶数,col++,row--,(向右下角移动)
12、数组和链表
数组:
优点:内存是连续的,已知首地址后,所有元素都可以访问,因此易于随机访问
缺点:插入,删除元素的复杂度较高,需要平移部分数组。
要事先固定容量,不灵活,许多业务容量都是未知且变化的。普林斯顿的算法课中,老爷爷提出了一种解决方案:
当元素数量等于容量时,把容量扩充成2倍;当元素数量等于容量的一半时,把容量减为原来的一半。
注意:C++不提供对数组越界的检查,所以可能越界,即取到了不属于该数组的值,而且还不容易察觉出这个错误。
在对二维数组全部元素赋值时,第一维长度可以忽略。
链表:
优点:内存不连续,较灵活,方便删除和插入操作
缺点:只能从头部顺序访问
13、三叉链表和二叉树相比,多存储了一个父节点。
当算法中经常需要遍历或者查找节点在遍历过程中的前驱,后继指针,就需要把数据结构定义为这种形式
举例:剑指offer里的一道题(中序遍历)
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。
注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
如果当前结点存在右子结点,那下一个结点就是从这个右子结点开始一直递归地找其最大深度地左子节点
如果当前结点不存在右子结点,且当前结点是其父结点的左子结点,那下一个结点就是其父结点;
如果当前结点不存在右子结点,且当前结点不是其父结点的左子结点,那就递归地指向父结点,直到满足结点是其父结点的左子结点,那下一个结点就是此刻的结点。如果直到根节点也不满足是左子节点的条件,则说明该结点是最后一个,那就结束

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录 目录 1 Graph 图论 3 | DAG 的深度优先搜索标记 3 | 无向图找桥 3 | 无向图连通度(割) 3 | 最大团问题 DP + DFS 3 | 欧拉路径 O(E) 3 | DIJKSTRA 数组实现 O(N^2) 3 | DIJKSTRA O(E * LOG E) 4 | BELLMANFORD 单源最短路 O(VE) 4 | SPFA(SHORTEST PATH FASTER ALGORITHM) 4 | 第 K 短路(DIJKSTRA) 5 | 第 K 短路(A*) 5 | PRIM 求 MST 6 | 次小生成树 O(V^2) 6 | 最小生成森林问题(K 颗树)O(MLOGM). 6 | 有向图最小树形图 6 | MINIMAL STEINER TREE 6 | TARJAN 强连通分量 7 | 弦图判断 7 | 弦图的 PERFECT ELIMINATION 点排列 7 | 稳定婚姻问题 O(N^2) 7 | 拓扑排序 8 | 无向图连通分支(DFS/BFS 邻接阵) 8 | 有向图强连通分支(DFS/BFS 邻接阵)O(N^2) 8 | 有向图最小点基(邻接阵)O(N^2) 9 | FLOYD 求最小环 9 | 2-SAT 问题 9 Network 网络流 11 | 二分图匹配(匈牙利算法 DFS 实现) 11 | 二分图匹配(匈牙利算法 BFS 实现) 11 | 二分图匹配(HOPCROFT-CARP 的算法) 11 | 二分图最佳匹配(KUHN MUNKRAS 算法 O(M*M*N)) 11 | 无向图最小割 O(N^3) 12 | 有上下界的最小(最大)流 12 | DINIC 最大流 O(V^2 * E) 12 | HLPP 最大流 O(V^3) 13 | 最小费用流 O(V * E * F) 13 | 最小费用流 O(V^2 * F) 14 | 最佳边割集 15 | 最佳点割集 15 | 最小边割集 15 | 最小点割集(点连通度) 16 | 最小路径覆盖 O(N^3) 16 | 最小点集覆盖 16 Structure 数据结构 17 | 求某天是星期几 17 | 左偏树 合并复杂度 O(LOG N) 17 | 树状数组 17 | 二维树状数组 17 | TRIE 树(K 叉) 17 | TRIE 树(左儿子又兄弟) 18 | 后缀数组 O(N * LOG N) 18 | 后缀数组 O(N) 18 | RMQ 离线算法 O(N*LOGN)+O(1) 19 | RMQ(RANGE MINIMUM/MAXIMUM QUERY)-ST 算法 (O(NLOGN + Q)) 19 | RMQ 离线算法 O(N*LOGN)+O(1)求解 LCA 19 | LCA 离线算法 O(E)+O(1) 20 | 带权值的并查集 20 | 快速排序 20 | 2 台机器工作调度 20 | 比较高效的大数 20 | 普通的大数运算 21 | 最长公共递增子序列 O(N^2) 22 | 0-1 分数规划 22 | 最长有序子序列(递增/递减/非递增/非递减) 22 | 最长公共子序列 23 | 最少找硬币问题(贪心策略-深搜实现) 23 | 棋盘分割 23 | 汉诺塔 23 | STL 中的 PRIORITY_QUEUE 24 | 堆栈 24 | 区间最大频率 24 | 取第 K 个元素 25 | 归并排序求逆序数 25 | 逆序数推排列数 25 | 二分查找 25 | 二分查找(大于等于 V 的第一个值) 25 | 所有数位相加 25 Number 数论 26 1 |递推求欧拉函数 PHI(I) 26 |单独求欧拉函数 PHI(X) 26 | GCD 最大公约数 26 | 快速 GCD 26 | 扩展 GCD 26 | 模线性方程 A * X = B (% N) 26 | 模线性方程组 26 | 筛素数 [1..N] 26 | 高效求小范围素数 [1..N] 26 | 随机素数测试(伪素数原理) 26 | 组合数学相关 26 | POLYA 计数 27 | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 | 线性方程组 A[][]X[]=B[] 28 | 追赶法解周期性方程 28 | 阶乘最后非零位,复杂度 O(NLOGN) 29 递归方法求解排列组合问题 30 | 类循环排列 30 | 全排列 30 | 不重复排列 30 | 全组合 31 | 不重复组合 31 | 应用 31 模式串匹配问题总结 32 | 字符串 HASH 32 | KMP 匹配算法 O(M+N) 32 | KARP-RABIN 字符串匹配 32 | 基于 KARP-RABIN 的字符块匹配 32 | 函数名: STRSTR 32 | BM 算法的改进的算法 SUNDAY ALGORITHM 32 | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面最近点对 O(N * LOGN) 34 | LIUCTIC 的计算几何库 35 | 求平面上两点之间的距离 35 | (P1-P0)*(P2-P0)的叉积 35 | 确定两条线段是否相交 35 | 判断点 P 是否在线段 L 上 35 | 判断两个点是否相等 35 | 线段相交判断函数 35 | 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | 射线与圆的第一个交点 36 | 求点 P1 关于直线 LN 的对称点 P2 36 | 两直线夹角(弧度) 36 ACM/ICPC 竞赛之 STL 37 ACM/ICPC 竞赛之 STL 简介 37 ACM/ICPC 竞赛之 STL--PAIR 37 ACM/ICPC 竞赛之 STL--VECTOR 37 ACM/ICPC 竞赛之 STL--ITERATOR 简介 38 ACM/ICPC 竞赛之 STL--STRING 38 ACM/ICPC 竞赛之 STL--STACK/QUEUE 38 ACM/ICPC 竞赛之 STL--MAP 40 ACM/ICPC 竞赛之 STL--ALGORITHM 40 STL IN ACM 41 头文件 42 线段树 43 求矩形并的面积(线段树+离散化+扫描线) 43 求矩形并的周长(线段树+离散化+扫描线) 44

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金枝玉叶9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值