
计算机技术---算法学习
.
头前一点白
工作,学习,生活,娱乐。正在学习平衡这些,做努力向上的人。
展开
-
《剑指offer》---Go语言实现
文章目录数组中重复的数字数组中重复的数字题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3解法一:简单解法:因为数字范围一定在0-n-1之间,表示可以使用哈希表来解决这个问题。建立一个数组切片number,长度为n,下标则表示0-n-1,初原创 2020-08-04 00:30:50 · 766 阅读 · 0 评论 -
图算法-拓扑排序
拓扑排序应用场景:例如选课,施工过程不可能出现两个课程的先选可都是互相或者施工中的两个项目形成先行必要的条件,那么这种应用场景下的图必须是无环图。AOV网(Activity On Vertex Network):用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称之为AOV网。什么是拓扑排序?拓扑排序就是说,在一个有n个顶点的有向图中,V中的顶点序...原创 2020-04-01 11:12:13 · 488 阅读 · 0 评论 -
数据结构学习之---图的代码实现
图的基本概念图:是由顶点的集合及顶点之间的关系集合(边)组成的一种数据结构。Graph=(V,E);(V表示顶点,E表示边)两个顶点之间没有方向,称这条边为无向边。组成的图为无向图。如果任意两个顶点之间都存在边,则称该图为无向完全图。具有n个顶点的无向完全图有n(n-1)/2.顶点之间有方向,称为有向边,组成的图为有向图。入度:箭头所指的顶点出度出箭头的顶点度数和边数的关系:度数...原创 2020-04-01 11:05:36 · 506 阅读 · 0 评论 -
算法学习---kmp算法详解
kmp算法先说怎样引出的kmp算法之前用的都是朴素模式匹配算法,它的基本思想就是:即从主串的第一个字符开始匹配,一直到最后匹配不上的话,则回到主串的第二个字符进行匹配。就这样一直循环,直到找完所有主串,返回结果。因为传统的字符串匹配算法会进行很多重复的运算,复杂度太高。所以就引出了kmp算法解决这个问题。KMP算法什么是KMP算法?KMP算法是由三位科学家的开头字母命名而成。...原创 2020-04-01 10:59:05 · 268 阅读 · 0 评论 -
数据结构---树(用C++代码实现)
树基本概念分类:1)空树. n=0时称为空树2)非空树.特点:(1)有且只有一个特定的称为根的结点.(2)其余结点分为m个互不相交的有限集,并且称为根的子树.树的深度:树中结点的最大层次称为树的深度或高度.结点的度:结点拥有的子树数称为结点的度.二叉树:由一个根结点和两个互不相交的子树组成.结点的数=总分支数+1特点:(1)每个结点最多有两颗子树(2)左子树和...原创 2020-04-01 10:48:26 · 5766 阅读 · 2 评论 -
数据结构------哈希表
传统的查找都是通过"比较"来实现的 . 比如说,顺序查找是"等于"和"不等于"来比较. 改进一些的方法,就是折半查找,二叉排序树,B-树查找,通过">","<","="来比较的.查找的效率依赖于查找过程中所进行的比较次数.这些查找方法元素在结构中的位置是随机的,存在不确定的关系.最理想的查找的方法就是我们可以根据要查找的元素关键字key直接得...原创 2019-04-25 19:54:33 · 280 阅读 · 0 评论 -
腾讯2019提前批笔试-----硬币题解
算法描述:牛家村的货币是一种很神奇的连续货币.他们货币的最大面额是n,并且一共有面额为1,面额为2,...,面额为n,n种面额的货币.牛牛每次购买商品都会带上所有面额的货币,支付时会选择给出数量最小的方案.现在告诉你牛牛将要购买的商品的价格,你能算出牛牛支付的硬币数量吗?第一行两个整数n,m.表示货币的最大面额和商品的价格.输出描述:一个整数表示牛牛支付的硬币数量.输入6 7...原创 2019-04-14 11:50:28 · 825 阅读 · 0 评论 -
动态规划入门-----数塔问题(求路径及路径最大值)
(思考)我们知道贪婪算法也是进行多阶段的决策过程,通过一系列的贪婪决策找到最优解.那么动态规划和贪婪算法的区别在哪里?如果不太清楚,我们从今天这个列子来体会.数塔问题:数塔从顶部出发,在每一个节点可以选择向左走或是向右走,一直走到底层,要去找出一条路径,使路径上的数值和最大. 9 12 15 10 6 8 2 ...原创 2019-04-14 16:58:43 · 5227 阅读 · 1 评论 -
贪婪算法入门之数列极差问题
贪婪算法:又称"贪心法".从问题的某一个初始解决出发逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止.算法适用的问题:贪心算法面对问题只考虑当前局部信息就要做出决策,也就是说适用于"局部最优策略能导致产生全局最优".思考:那么它和动态规划都是求最优解,区别在哪里?不明白可以看这篇博文:https://blog...原创 2019-04-14 17:21:43 · 1637 阅读 · 0 评论 -
动态规划---01背包问题详解
与利润有关的背包问题.问题描述:一个商人带着一个能装m千克的背包去乡下收购货物,准备将这些货物卖到城里获利.现有n种货源,且知第i种货物有wi千克,可获利pi元.请编写算法帮助商人收购货物,以获取更高的利润.算法思路:我们可以将商品逐个放进去.每次求得重量允许范围内的最大利润,后面放进去的商品求解最大利润根据前面放进去的商品利润最优解计算.而且每一步的过程无后向性,即后面放进去的商品,...原创 2019-04-19 18:00:47 · 2336 阅读 · 1 评论 -
动态规划---最长不下降子序列(简洁)
问题描述:求一个数列的最长不下降子序列.设有由n个不相同的整数组成的数列,记为:a(1),a(2),...,a(n)且a(i)<>a(j) (i<>j)若存在i1<i2<i3,...,<ik且有a(i1)<a(i2)<...<a(ik),则称为长度为k的不下降序列.请编写算法实现.举例:整数组成的数列为3,18,7,14,...原创 2019-04-20 10:49:19 · 5077 阅读 · 0 评论 -
算法------桶排序
时间复杂度O(N);空间复杂度O(N);桶排序简单入门:算法思想:空间换时间.找出需要排序的数中的最大值,然后申请一块空间大小为这个最大值+1的空间,每个空间看做一个桶,将各个数字分别放入桶中统计.然后从0开始遍历每个桶,按桶中元素个数--取出并打印.举个栗子:现有0-10以内的数,创建11个桶,编号从0~10。每出现一个数,就在对应编号的桶中放一个小旗子,最后...原创 2019-04-13 16:23:11 · 145 阅读 · 0 评论 -
数据结构与算法之哈希表及实现
传统的查找都是通过"比较"来实现的 . 比如说,顺序查找是"等于"和"不等于"来比较. 改进一些的方法,就是折半查找,二叉排序树,B-树查找,通过">","<","="来比较的.查找的效率依赖于查找过程中所进行的比较次数.这些查找方法元素在结构中的位置是随机的,存在不确定的关系.最理想的查找的方法就是我们可以根据要查找的元素关键字key...原创 2019-03-19 10:50:54 · 520 阅读 · 0 评论 -
选择排序--(简单选择排序,堆排序,以及构建最大堆和最小堆)
选择排序基本思想:每一趟在后面n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录。通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之。步骤:可以看出选择排序是一个不稳定算法。算法代码://选择排序(稳定算法)void SelectSort(int *array, int length){ ...原创 2019-03-05 16:15:01 · 934 阅读 · 0 评论 -
算法-----归并排序
归并排序:“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储结构还是链表存储结构,都可在O(m+n)的时间量级上实现。基本思想:(1)初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1 (2)然后两两归并,得到[n/2]个长度为2或者1的有序子序列,再两两归并......原创 2019-03-06 10:51:43 · 162 阅读 · 0 评论 -
排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)算法详解
第一天主题:排序算法排序算法是经常使用的算法,我们一定要把每一个步骤都想清楚,而且用代码实现,这样才能使我们在算法路上走得更远。什么是排序算法的稳定性? 如果在元素序列中有两个元素R[i]和R[j],关键码K[i]=k[j],且在排序之前R[i]在R[j]的前面,在排序之后如果R[i]仍然在R[j]的前面,则称这个排序算法是稳定的,反之则称这个排序算法是不稳定的。理解内部排序和...原创 2019-03-03 15:09:59 · 1561 阅读 · 1 评论 -
算法------基数排序
基数排序借助多关键字排序的思想,不利用关键字之间比较,而是“分配”和“收集”。分类:LSD:从最低位优先排序。MSD:最高位优先排序。举个栗子:73 22 93 43 55 14 28 65 39 81首先根据个位数的数值,在遍历数据时将它们各自分配到编号0至9的桶中。分配结束后,进行桶中重新收集,得到如下序列:81 22 73 93 43 14 55...原创 2019-03-06 15:15:31 · 373 阅读 · 0 评论 -
排序算法总结(应用场景,稳定性及时间复杂度)
排序总结:排序算法的应用场景:(1)从平均时间性能而言,快速排序最佳,其所需时间是最省,但快速排序在最坏的情况下的时间性能不如堆排序和归并排序。(2)当空间大资源足,要求时间效率时,可采用归并排序。(3)堆排序虽然较之快排慢一些,但特别适合海量数据的排序。如在100万个数据里面找出前1000大的数据。可以用建立一个小顶堆存储1000元素。(4)当序列中的记录基本有序或n值较小,...原创 2019-03-06 15:58:28 · 2315 阅读 · 0 评论 -
数据结构与算法之二叉排序树(又名二叉查找树,二叉搜索树)
今天看到一句话分享一下,所谓优势只不过比别人深入思考一点而已。多看书,多思考。二叉排序树(二叉搜索树,二叉查找树)基本性质:1.若它的左子树不空,则左子树上所有节点的值均小于它的根结点的值2.若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值3.它的左右子树也是二叉排序树应用目的:并不是为了排序,而是为了提高查找和插入删除关键字的速度。二...原创 2019-03-09 11:42:02 · 1181 阅读 · 0 评论 -
交换排序(冒泡排序,优化冒泡排序,快速排序,以及快速排序优化的三种方法详解)
交换排序:利用交换元素的位置进行排序的方法称为交换排序。常用的交换排序有冒泡排序和快速排序。冒泡排序算法:基本思想:n个元素,序列进行N-1次循环,依次比较相邻两个元素的大小,如果array[i]>array[i+1],则交换两个元素,反之则不交换。这样每次循环都能比较出数值最大的那个元素。最好最坏情况:最好情况是正序,时间复杂度是O(N),比较次数为n-1次...原创 2019-03-04 21:29:30 · 1879 阅读 · 0 评论 -
算法之字符串全排列,全组合问题详解------(剑指offer)
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印由字符abc所能排列出来的所有字符串abc,acb,bac,bca,cab,cba.问题解析:(1)求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符进行交换。(2)固定第一个字符,求后面的排列。(3)仍然可以把后面的分成第一步和第二步。以abc为例:(1)...原创 2019-03-08 11:07:47 · 673 阅读 · 0 评论 -
算法之动态规划(剑指offer-剪绳子详解)
动态规划与分治法相似,都是通过组合子问题的解求解原问题. 动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题.其通常用来求解最优化问题.动态规划求解问题的四个特点:1)求一个问题的最优解.2)整体问题的最优解依赖于各个子问题的最优解.3)我们把大问题分解成若干个子问题,这些小问题之间还有相互重叠的更小的子问题.4)用从上往下的顺序先计算小问...原创 2019-03-21 21:17:47 · 1985 阅读 · 0 评论 -
数据结构与算法之B树,B+树总结
对搜索之总结:数据杂乱无规律--------->线性搜索 O(n)数据已序------->二分查找 O(logn),最差情况下退化成单支树O(n)二叉排序树,和二分查找一样 O(logn),最差情况成斜树,O(n)AVL树/红黑树----------->O(logn)引入B树的背景: 数据保存在磁盘上,若数据量大不能全部加...原创 2019-03-19 10:42:46 · 333 阅读 · 0 评论