
Data Structures and Algorithms
lvcoc
吃到老,玩到老,原来,我已经这么老了
展开
-
时间复杂度
时间复杂度:用来评估算法运行效率的一个式子先看下面栗子感受一下 Debug.log("ok");//0(1) foreach (var item in collection) { Debug.log("ok");//0(1) }//0(n) foreach (var item in c...原创 2020-02-08 16:18:24 · 180 阅读 · 0 评论 -
关于超大整数的幂运算_C#
BigInteger a = 9123456789; BigInteger b = BigInteger.Pow(a, 9999); //Output this number if you're feeling lucky. Console.WriteLine(b);原创 2020-02-05 16:05:43 · 1039 阅读 · 0 评论 -
RSA加密_c#
首先RSA加密是非对称加密,也就是他的公钥和秘钥不相等,公钥匙公开的,任何人都可以通过公钥对明文进行加密,然后只有拥有秘钥的人才可以进行解密来看RSA的加密过程1.随机选取两个质数p和q 注:质数就是约数只有自己和12.计算n=pq3.选取一个与p(n)互质的小奇数e,p(n)=(p-1)(q-1) 注:互质就是最大公约是14.对模中(n),计算e的乘法逆元d,即满足(e*d...原创 2020-02-05 14:20:23 · 329 阅读 · 0 评论 -
欧几里得算法——分数的四则运算_C#
直接自己封装一个类 class Fraction { int numerator;//分子 int denominator;//分母 public int Numerator { get { return numerator; ...原创 2020-02-05 12:41:31 · 235 阅读 · 0 评论 -
欧几里得算法——最大公约数_C#
约数:如果整数a能被整数b整除,那么a叫做b的倍数,b叫做a的约数。给定两个整数a,b,两个数的所有公共约数中的最大值即为最大公约数(Greatest Common Divisor,GCD)。例:15与35的最大公约数是7欧几里得算法:gcd(a,b)=gcd(b,a mod b) 注:mod就是取余举例:gcd(15,35)=gcd(35,5)=gcd(5,0)=5代码实现...原创 2020-02-05 12:16:01 · 551 阅读 · 0 评论 -
最长公共子序列(LCS)_C#
一个序列的子序列是在该序列中删去若干元素后得到的序列。例:“ABCD”和“BDF”都是“ABCDEFG”的子序列最长公共子序列(LCS)问题:给定两个序列X和Y,求X和Y长度最大的公共子序列。例:X="ABBCBDE" Y="DBBCDB" LCS(X,Y)="BBCD"直接上递推式C[i,j]表示Xi和Yj的LCS长度令X=(x1,x2,…,xm)和Y=(1,y2,...原创 2020-02-05 00:08:36 · 615 阅读 · 0 评论 -
动态规划_C#
先不管动态规划,先看斐波那契数列斐波那契数列:F1=Fn-1+Fn-2分别用递归和非递归实现一下递归 //递归 public int FibnacciA(int n) { int res; if (n == 1 || n == 2) res = 1; else r...原创 2020-02-04 15:02:54 · 1057 阅读 · 0 评论 -
贪心算法_C#
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。第一个问题 找零假设商店老板需要找零n元钱,钱币的面额有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少?...原创 2020-02-03 16:00:20 · 1611 阅读 · 0 评论 -
汉诺塔问题_C#
先偷个百度百科,读书人的事算偷吗,是拿!该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。那么首先,我们可以先从两个盘子开始试试,1...原创 2020-02-02 12:45:42 · 277 阅读 · 0 评论 -
基数排序_C#
首先我们引入一个多关键排序的概念多关键字排序:假如现在有一个员工表,要求按照薪资排序,年铃相同的员工按照年龄排序。那么我们从低关键词开始排序,先按照年龄进行排序,再按照薪资进行稳定的排序。稳定排序也就是相同元素位置不变的排序,比如冒泡排序就是一种稳定排序,堆排序就是不稳定的排序,品,你细细的品那么对32,13,94,52,17,54,93排序,是否可以看做多关键字排序?比如32...原创 2020-02-01 23:26:30 · 337 阅读 · 1 评论 -
桶排序_C#
桶排序是由计数排序衍生,我们知道计数排序需要先建立一个给定范围大小的列表,如果元素范围是0-1亿呢,那么我们需要将这个列表分割成几个小范围,比如0-49范围分为0-910-1920-29 30-39 40-49,也就是分成几个桶桶排序(Bucket Sort):首先将元素分在不同的桶中,在对每个桶中的元素排序。 /// <summary> /// ...原创 2020-02-01 23:12:39 · 462 阅读 · 0 评论 -
计数排序_C#
计数排序就是对一个已知元素范围的列表,比如1324123135首先建立一个0-5长度的列表,开始计数0 01 32 23 34 15 1然后挨个输出 111223345,排序完成 public void CountSort(List<int> li,int maxCount) { List<int> c...原创 2020-02-01 22:30:23 · 168 阅读 · 0 评论 -
希尔排序_C#
希尔排序(Shell Sort)是一种分组插入排序算法。首先取一个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。 public voi...原创 2020-02-01 22:09:05 · 298 阅读 · 0 评论 -
归并排序_C#
归并排序——归并假设现在的列表分两段有序,如何将其合成为一个有序列表这种操作称为一次归并。先实现一次归并看看 //归并 public void Merge(List<int> li,int low,int mid,int high) { int i = low;//i指向左边有序段第一个元素 int j = m...原创 2020-02-01 15:16:03 · 145 阅读 · 0 评论 -
堆排序-TOPK问题_C#
现在有n个数,设计算法得到前k大的数。(k<n)首先从原列表截取前K个元素,组成一个新列表。然后将这个新列表构建成一个小根堆,那么根就新列表中最小的数。接着继续从原列表取出K以后的元素,和小根堆根比对,如果比根小,那么肯定不属于前K大的数,如果比根大,替换根,然后做一次向下调整,根重新变成新列表最小的数,接着继续从原列表取数比对,直到取到原列表最后。那么就可以得到一个前K大的...原创 2020-02-01 14:26:16 · 333 阅读 · 0 评论 -
堆排序_C#
了解堆排序前,需要先了解二叉树(请自行了解)首先堆排序是完全二叉树,大根或者小根,随便,然后父节点得到左孩子2i+1,右孩子2i+2,孩子得到父亲(i-1)/2堆排序——堆的向下调整性质假设根节点的左右子树都是堆,但根节点不满足堆的性质,也就是不满足大根或者小根可以通过一次向下的调整来将其变成一个堆。以大根堆举例,先把根取下来,比如2,就需要一个元素填上去,找左右孩子最大的移上...原创 2020-02-01 13:39:57 · 197 阅读 · 0 评论 -
快速排序_C#
快速排序:快快速排序思路:原列表 574631298取一个元素p(第一个元素),使元素p归位;取5并且当前列表被p分成两部分,左边都比p小,右边都比p大;列表变成 214356789最后递归完成排序。123456789首先完成框架 //快速排序框架 public void QuickSort(List<int> li,int left,int ...原创 2020-02-01 11:55:14 · 250 阅读 · 0 评论 -
插入排序_C#
插入排序(Insert Sort)就比如我们平时打牌初始时手里(有序区)只有一张牌每次(从无序区)摸一张牌,插入到手里已有牌的正确位置这样保证摸完牌后,手里的牌都是有序的 public void InsertSort(List<int> li) { int tmp = 0; int j = 0; for...原创 2020-02-01 11:54:29 · 142 阅读 · 0 评论 -
选择排序_C#
选择排序(SelectSort)一趟排序记录最小的数,放到第一个位置再一趟排序记录记录列表无序区最小的数,放到第二个位置。。。。。。 public void SelectSort(List<int> li) { int min = 0; for (int i = 0; i < li.Count-1; i++)//i第...原创 2020-02-01 11:54:16 · 160 阅读 · 0 评论 -
冒泡排序_C#
冒泡排序(Bubble Sort)列表每两个相邻的数,如果前面比后面大,则交换这两个数。一趟排序完成后,则无序区减少一个数,有序区增加一个数。 public void BubbleSort(List<int> li) { for (int i = 0; i < li.Count-1; i++)//i 第几趟 { ...原创 2020-02-01 11:53:55 · 190 阅读 · 0 评论 -
二分查找_C#
二分查找(BinarySearch):又叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。PS:二分查找只针对有序的列表 //只针对有序的列表 public int BinarySearch(List<int> li, int value) { int left = 0; ...原创 2020-02-01 11:53:28 · 197 阅读 · 0 评论 -
顺序查找_C#
顺序查找(也叫线性查找) Linear Search从列表第一个元素开始,顺序进行搜索,直到找到元素活着搜索到列表最后一个元素为止 public int LinearSearch(List<int> li, int value) { for (int i = 0; i < li.Count; i++) { ...原创 2020-02-01 11:52:30 · 522 阅读 · 0 评论 -
8大排序&查找算法_C#
开个坑,响应国家要求宅在家,重新把 排序查找算法撸了一遍查找算法顺序查找二分查找排序查找冒泡排序选择排序插入排序快速排序堆排序归并排序希尔排序计数排序桶排序基数排序题外话汉诺塔问题堆排序-TOPK问题...原创 2020-02-01 11:52:26 · 233 阅读 · 0 评论