
数据结构与算法篇
yin__ren
本人毕业于华中科技大学,现就任于美团,从事Java后台开发,欢迎大家相互交流学习
展开
-
桶(基数)排序与stack的中缀与后缀的转换(C语言)
桶排序:把数组中的所有元素分为若干个数据块,也就是若干个桶,然后对每个桶里的数据进行排序,最后将所有桶里的数据依次排列即可。 #include<stdio.h> #include<malloc.h> typedef struct node { int key; struct node * next;}KeyNode;void inc_sort(int keys[], int原创 2017-12-22 21:01:06 · 288 阅读 · 0 评论 -
排序(三)之堆排序
由堆的性质可知,由于每个 DeleteMin 花费的时间为 O(logN),因此总的运行时间是 O(NlogN)。但该算法的主要问题在于它使用了一个附加数组。避免使用第二个数组的方法: 在每次 DeleteMin 之后,堆缩小了 1 。因此,位于堆中最后的单元可以用来存放刚刚删去的元素。例如:设我们有一个堆,它包含六个元素。第一次 DeleteMin 产生一个 A1。现在只有五个元素,因原创 2017-12-29 00:38:15 · 241 阅读 · 0 评论 -
排序(四)之归并排序
简单描述 这个算法合并的是两个已排序的表 步骤: 1. 取两个输入数组 A 和 B,一个输出数组 C,以及三个计数器 Aptr,Bptr,Cptr,它们初始置于对应数组的开端。 2. A[Aptr] 和 B[Bptr] 中的较小者被拷贝到 C 中的下一个位置,相关的计数器向前推进一步。 3. 当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到 C 中。该算法是经原创 2017-12-29 00:59:10 · 194 阅读 · 0 评论 -
排序(五)之快速排序
算法步骤: (对数组S) 如果 S 中元素个数是 0 或 1,返回 取 S 中任一元素 v ,称之为 枢纽元 将 S - { v } (S 中其余元素)分成两个不相交的集合: S1 = { x ∈ S - { v } | x ≤ v }S2 = { x ∈ S - { v } | x ≥ v } 返回{ quickSort(S1) 后,随即 v ,继而 quickSor原创 2017-12-29 01:46:20 · 384 阅读 · 0 评论 -
判定两棵树是否是同构树(C语言)
问题描述: 如果树 T1 通过交换其(某些)节点的左右儿子变换成树 T2,则称树 T1 与树 T2 同构。 代码: //树同构的判定#includestdio.h>#includestdlib.h>#define YES 1#define NO 0typedef struct DTree* tree;typedef char ElementType;v原创 2018-01-06 22:36:49 · 2546 阅读 · 0 评论 -
2-d 树的插入与遍历(C语言)
//2-d Tree#include #include #define ElementType chartypedef struct TreeNode* Tree;Tree Insert(ElementType *key1, ElementType *key2, Tree tree, int deep);void PrintTree(Tree tree, ElementType *原创 2018-01-07 00:18:33 · 1632 阅读 · 2 评论 -
算法导论(一)之排序
InsertionSort(A, n) { for i = 2 to n { key = A[i] j = i - 1 while (j &amp;amp;amp;amp;amp;amp;gt; 0) and (A[j] &amp;amp;amp;amp;amp;amp;gt; key) { A[j+1] = A[j] j = j - 1 } A[j+1] = key }}原创 2018-10-20 09:41:35 · 406 阅读 · 0 评论 -
算法导论(二)之分治策略
一、最大子数组1. 伪代码FIND-MAXIMUM-SUBARRAY(A,low,high){ if high == low return (low,high,A[low]) else mid = (low + high) / 2 (left-low,left-high,left-sum) = FIND-MAXIMUM-SUBARRAY(A,low,mid) (right...原创 2018-10-20 15:39:18 · 429 阅读 · 0 评论 -
算法导论(三)之随机算法
随机化算法讲解推荐阅读随机化算法1. 随机数1. 通过线性同余算法实现用线性同余法生成“伪”随机数算法java实现–概率算法–随机数博主并没有搞懂,为什么要这样实现线性同余算法,知道是同志麻烦在评论区告知一下2. 通过 Java 的 UUID 生成public static String randomUUID() { return UUID.randomUUI...原创 2018-10-21 10:37:18 · 782 阅读 · 0 评论 -
算法导论(四)之统计算法
一、求最大最小值1. 求最小值Minimum(A) min ← A[1] for i = 2..n do if A[ i ] < min then min ← A[ i ] return min2. 同时求最大最小值Min-Max(A) for i = 1..n / 2 do if A[2i – 1] ≤ A[2i] then B[i] ← A[2i – 1]...原创 2018-10-21 11:09:08 · 295 阅读 · 0 评论 -
算法导论(五)之动态规划
1. 装配线调度问题动态规划之 装配线调度问题 推荐阅读1. 伪代码2. Java 代码实现二、钢条切割算法导论-动态规划-钢条切割 推荐阅读1. 自顶向下递归实现1. 伪代码CUT-ROD(p,n) if n == 0 return 0 q = -1 for i = 1 to n q = max(q,p[i] + CUT-ROD(p,n - i)) ...原创 2018-10-21 17:42:14 · 359 阅读 · 0 评论 -
算法导论(六)之贪婪算法
动态规划是先分析子问题,再做选择。而贪心算法则是先做贪心选择,做完选择后,生成了子问题,然后再去求解子问题与动态规划方法相似,是更简单的解决优化问题的方法,通常用于求解优化问题贪婪算法不能保证一定得到最优解对于具有某些特征的问题,贪婪算法有最优解1. 作业(活动)选择问题从 活动选择问题 看动态规划和贪心算法的区别与联系 推荐阅读对n个作业进行排程,这些作业在执行期间需...原创 2018-10-26 21:07:48 · 1043 阅读 · 0 评论 -
算法导论(七)之图算法
1. 基本图算法1. 广度优先搜索(BFS)从临近源顶点s最近的顶点开始,通过对图G的边的探索发现从源顶点s能够抵达的每个顶点1. 伪代码BFS(G,s) for each vertex u 属于 G.V - {S} u.color = WHITE u.d = 无穷 u.pi = NIL s.color = GRAY s.d = 0 s.pi = NIL Q = ...原创 2018-10-26 22:04:23 · 1191 阅读 · 0 评论 -
排序(二)之希尔排序
基本描述: 先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序缩小增量排序 希尔排序(缩小增量排序)通过比较相距一定间隔的元素来工作;各躺比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。 void shellS原创 2017-12-29 00:12:47 · 228 阅读 · 0 评论 -
排序(一)之插入排序
插入排序由 N - 1 趟排序组成,对于 P = 1 趟到 P = N - 1 趟,插入排序保证从位置 0 到位置 P 上的元素为已排序状态。void insertSort(ElementType arr[], int n){ int j, p; ElementType tmp; for(p = 1; p < n; p++) { tmp = arr原创 2017-12-28 23:59:53 · 148 阅读 · 0 评论 -
基数排序与桶式排序(C语言)
基数排序#include <stdio.h>static int count (int a[], int n, int b[]){ int i; int k; for (i = 0; i < n; i++) { k = a[i]; b[k]++; } return (0);}static int a[10] = {6原创 2017-12-26 19:41:01 · 653 阅读 · 0 评论 -
使用分离链路法处理冲突(C语言)
使用分离链路法处理冲突 问题描述 Hash表的大小为2k-1,初始可以为15表中的装填因子达到3/4时,增加表的大小至2k+1 –1,完成再哈希实现插入,删除和查找操作问题分析与算法设计 hash表 :首先定义一个数组链表,元素存储在链表中,并且每个链表是首元素为仅为表头,不存储任何元素。插入 :首先找到链表数组位置,然后将元素查到元素前端删除 :同样先查找元素,如果存储,则删除,原创 2018-01-11 12:33:42 · 482 阅读 · 0 评论 -
稀疏多项式乘法改进
问题描述: 稀流多项式乘法的改进问题分析与算法设计: 基本思路是创建一个结构体节点,储存每一项的系数(int),指数(int),和一个next指针。 输入两个链表A和B后: 当指数相等时,系数相成;相加完的系数若不为0,则存进链表C;若指数不相等,若A的指数小于B的,将A的节点里的系数,指数都存进链表C;反之,则将B的节点里的系数,指数都存进链表C;当有一个链表的后几项多出来时,也原创 2018-01-11 13:21:28 · 587 阅读 · 0 评论 -
切披萨与河内塔问题(C语言)
切披萨:把一张披萨饼切n刀,最多能得到多少块饼?用C语言实现函数,输入参数为n,返回结果int qie(int n){ if (n == 0) { return 1; } else { return qie(n - 1) + n; }}河内塔问题:移动n层的塔,总的移动次数是多少?int han原创 2018-01-21 09:19:06 · 1785 阅读 · 0 评论 -
Fibonacci数列与递归
Fibonacci数列与递归第一个月有一对刚诞生的兔子第二个月之后它们可以生育每月每对可生育的兔子会诞生下一对新兔子兔子永不死去 F0 = 0; F1 = 1; Fn = Fn-1 + Fn-2递归实现 效率低下,递归树表明存在大量重复计算 缺乏参数验证保护,易造成死循环,例如fib(-2)int fib (int n){ if (n == 1原创 2018-01-21 09:49:38 · 1684 阅读 · 0 评论 -
折半查找
折半查找:如果找到x,返回其索引;否则返回-1int bin_search(int a[], int x, int first, int last){ int mid = (first + last) / 2; if (first > last) return (-1); if (x > a[mid]) return (bi原创 2018-01-21 10:08:41 · 251 阅读 · 0 评论 -
求整数幂
问题的规模是n, 把n分解 如果n是偶数,n = 2 * n/2;否则n = 2 * n/2 + 1 因此, x0=1x^0 = 1 xn={(x2)n2n is even(x2)n2∗xx otherwisex^n =\left\{\begin{array}\\(x^2)^{\frac{n}{2}}\qquad n\ is\ even\\{(x^2)^{\frac{n}原创 2018-01-21 10:45:18 · 407 阅读 · 0 评论 -
最大子序列和问题的求解
最大子序列和问题的求解1. 三重循环int maxsub1(int a[], int n){ int maxsum = 0, currsum = 0; int i, j, k; for (i = 0; i < n; i++) for (j = i; j < n; j++) { for (currsum = 0原创 2018-01-21 11:44:38 · 159 阅读 · 0 评论 -
求最大主元
大小为 N 的数组A,其主要元素是一个出现次数超过 N/2 的元素int major_i(int a[], int n){ int count = 0, i, j; int candidate; for (i = 0; i < n; i++) { j = a[i]; if (count == 0) ca原创 2018-01-21 11:47:11 · 386 阅读 · 0 评论 -
根据中序遍历结果和前序(后序)遍历结果重构二叉树
问题描述: 给出一棵二叉树的先序(或后序)遍历结果,以及中序遍历结果,如何构造这棵树首先,我们需要回顾二叉树的三种遍历方式: 前序遍历:根+左子树+右子树 中序遍历:左子树+根+右子树 后序遍历:左子树+右子树+根假设,当前二叉树的前序遍历结果为{1,2,4,5,3,6},中序遍历结果为{4,2,5,1,3,6}前序遍历的第一个元素,必然是树根,此处为1。 2. 根据“原创 2017-12-28 22:11:39 · 828 阅读 · 0 评论 -
二叉树的层序遍历
二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历。在同一层中,则按从左到右的顺序对结点逐个访问。在进行层次遍历时,当前层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对列头取出一个元素,每取一个元原创 2017-12-28 23:42:07 · 985 阅读 · 0 评论 -
n个人围坐一圈
/************************************n个人围坐一圈,编号从1到n。依次从第一人开始,一人出去,留下一人;再出去2人,留下一人;...出去k人,留下一人;...直至所有人出完。给定n,最后出去的人编号是多少?编写程序实现:输入n,返回编号。*/#include <stdio.h>//***********************************st原创 2017-12-26 20:24:17 · 1481 阅读 · 0 评论 -
算法导论复习总结
一、概述1. 算法表述自然语言(ENGLISH)算法描述语言(Pseudo-code)计算机程序语言(C++,Java)硬件设计(DSP)2. 算法一般特性**正确性:**对于符合输入类型的任意输入数据,都产生正确的输出**有效性:**每一步指令能够被有效的执行,并且规定了指令的执行效果,结果应该具有的数据类型,而且是可以预期的**确定性:**每一步之后都要...原创 2018-12-01 11:31:19 · 3585 阅读 · 1 评论