数据结构和算法的学习
文章平均质量分 59
QiaoDog
这个作者很懒,什么都没留下…
展开
-
【算法】最大堆之Python实现
class MaxHeap(object): def __init__(self, data=None): self._data = data if data else [] self._count = len(self._data) self._heapify() def __len__(self): return self._count def __repr__(self): return st原创 2021-02-07 23:00:46 · 216 阅读 · 0 评论 -
【算法】一些线性排序算法
一、计数排序使用这个算法有一个前提,待排序的数组a,其所有的元素分布在区间[0,k],该算法的时间复杂度为O(n+k),当k=O(n)时,运行时间为O(n),所以当k比较小的时候适合采用这个算法下面给出这个算法实现的代码#include using namespace std;void counting_sort ( int a[], int k, int len )原创 2016-08-30 20:22:26 · 523 阅读 · 0 评论 -
【算法】查找数组第i小的元素的算法
1.一个思路:怎么同时找出一个数组的最大值和最小值,越快越好?1.1 一种最普通的办法是设max = min = a[0],遍历一遍数组a,每个元素分别和max,min做比较,并对这两个值进行相应的更新,这样的话,比较次数为 2*(n-1)1.2 这次,把这个数组的元素分成每两个元素一对,先不考虑奇偶性,然后这两个数先进行比较,比出大小,然后大的再和max比较,小的再和min比较,则每两个...原创 2016-09-01 20:28:07 · 1494 阅读 · 0 评论 -
【算法】KMP算法的实现
这个算法主要的内容是next数组的实现,next数组的含义如下: next数组的含义就是一个固定字符串的最长前缀和最长后缀相同的长度。对于目标字符串ptr,ababaca,长度是7,所以next[0],next[1],next[2],next[3],next[4],next[5],next[6]分别计算的是 a,ab,aba,abab,ababa,ababac,ababaca的相同的最长前缀和最长原创 2018-04-03 22:04:59 · 167 阅读 · 0 评论 -
【算法】k-sum 问题
2sum问题 这道题在剑指 offer 上面有,具体的链接为https://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b?tpId=13&tqId=11195&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interview...原创 2018-04-19 15:47:13 · 2872 阅读 · 0 评论 -
【算法-动态规划】求数组的最长上升子序列(LIS)的长度
《算法导论》上面对于动态规划的描述对于我来说有点晦涩难懂。于是在知乎上面看了一下关于这方面的知识,这个回答貌似还不错。 什么是动态规划?动态规划的意义是什么? - 徐凯强 Andy的回答 - 知乎 https://www.zhihu.com/question/23995189/answer/35324479这里提供了一个例题来解释动态规划的原理: 给定一个数列,长度为N, 求这个数列的...原创 2018-04-24 18:34:36 · 3348 阅读 · 3 评论 -
【数据结构复习】1.数组
这个系列是为了准备考研复试而把王道上的代码再拿出来敲一遍,用的是 C 语言,用的 IDE 是 VC 6.0,非常操蛋,唉, 那也得忍着啊。摆正自己的态度吧。1.数组的定义#define initSize 100typedef struct { Elemtype *data; int maxSize, length;} seqList2.数组的操作2.1 插入操作//...原创 2019-01-11 19:05:29 · 289 阅读 · 0 评论 -
根据遍历序列重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。1)根据前序、中序遍历重建二叉树/** * Definition for binary tree * public class TreeNode { * ...原创 2019-03-11 08:52:45 · 620 阅读 · 0 评论 -
二叉树后序遍历的非递归实现
void postOrder2 ( BTree t ) { BTree stack[100]; int top = -1; BTree pcur = t, plast = NULL; if ( !t ) { return; } while ( pcur ) { stack[++top] = pcur; ...原创 2019-03-27 01:29:19 · 572 阅读 · 0 评论 -
求两个升序序列的中位数
1.等长序列题目来源于王道考研数据结构书一个长度为L(L≥1)的升序序列S,处在第 ⌈L/2 ⌉ 个位置的数称为S的中位数。例如,若序列S1=(11,13, 15,17, 19), 则S1 的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2= (2, 4, 6, 8, 20), 则S1和S2的中位数是11。现在有两个等长升序序列A和B,试设计一个在时间和空间两方...原创 2019-03-27 16:19:07 · 5319 阅读 · 1 评论 -
最长回文子串以及 Manacher 算法
正如孔乙己知道“回”字有四种写法这个问题也有四种解决的方法暴力法枚举这个字符串的所有子串,再判断是否为回文。时间复杂度为 O(n^3)此处不实现,太弱智了中心扩展法从字符串的每一个字符开始,以此为中心,向两侧扩展,直到不是回文为止。这种方法的时间复杂度是 O(n^2)。但是要考虑到许多特殊情况。如 bb,abbbb,bbbb 等偶数个的回文,所以逻辑上比较复杂。使用这种方法打...原创 2019-04-02 18:02:52 · 163 阅读 · 0 评论 -
【算法】快速排序——基于分治思想的实现
今天看了《算法导论》的快排部分,又更加理解了这个算法现在将它实现了,以后就直接用了#include using namespace std;// 这个函数的作用是将数组a从下标p到r这部分进行一个划分// 将a[r]放到合理的位置(下标q处),使得 任意 p<=i<q:a[i]<=a[q]// 任意 q = a[q]int partition ( int* a, in原创 2016-08-30 14:39:48 · 1010 阅读 · 0 评论 -
【数据结构】堆排序
题源:北航六系 数据结构作业【问题描述】对一含有n个整数的数组,使用堆排序将其由小到大排序。【输入形式】第一行为元素个数n,第二行为n个整数(以空格隔开)。【输出形式】输出n个整数(以空格隔开)【样例输入】6 43 2 56 1 22 9【样例输出】1 2 9 22 43 56============================================ #include <std...原创 2015-12-25 17:21:04 · 2014 阅读 · 1 评论 -
【算法学习】归并排序——基于分治思想
归并排序的核心就是分治,把大问题转换成小问题照着算法导论,敲了一段代码,调了一下,这是适合自己用的,以后再要用到归并排序就懒得自己再想了,直接用这里的C++版using namespace std;//这个函数是将两个已经排好序的数组转换成为一个数组// a[p...q]和a[q+1...r]void merge( int *a, int p, int q, int r ) { ...原创 2016-07-08 20:58:54 · 640 阅读 · 0 评论 -
【数据结构】【输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果】
题目来源:北航14级6系数据结构作业题【问题描述】输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。【输入形式】输入任意长度的数组,数字之间空格分开【输出形式】true 或者 false【样例输入】输入5 7 6 9 11 10 8【样例输出】true【样例说明】由于这一整数序列是如下树的后序遍历结果:原创 2015-11-14 19:59:19 · 2768 阅读 · 1 评论 -
【数据结构】求节点的哈夫曼的带权路径长度
题目来源:北航14级6系数据结构作业【问题描述】 已知输入一串正整数,正整数之间用空格键分开,请建立一个哈夫曼树,以输入的数字为叶节点,求这棵哈夫曼树的带权路径长度。【输入形式】 首先输入正整数的个数,然后接下来为接下来的正整数,正整数个数不超过10个【输出形式】 输出相应的权值【样例输入】 5 4 5 6 7 8【样例输出】 69原创 2015-11-15 09:29:18 · 7325 阅读 · 0 评论 -
从下至上按层遍历二叉树
题目来源:北航14级5系数据结构作业问题描述】 给定一颗二叉树,要求从下至上按层遍历二叉树,每层的访问顺序是从左到右,每一层单独输出一行。【输入形式】 广义表表示的二叉树,结点元素类型为整型,且都大于0,例如:1( 2( 3 ( 4, 5 ) ), 6( 7, 8( 9, 10 ) ) )【输出形式】 从下至上,打印每一层的结点元素值,元素间以空格隔开。每层的访原创 2015-11-16 02:18:14 · 4184 阅读 · 3 评论 -
【数据结构】用Hash方法统计数字出现次数
题源:北航6系数据结构作业【问题描述】用HASH方法统计整数出现的次数【输入形式】以逗号分隔,#结尾的整数【输出形式】等式。左侧为排序好的整数,右侧为其出现的次数。【样例输入】2, 6, 7, 13, 18, 3, 6, 1, 3, 7#【样例输出】1=12=13=26=27=213=118=1一开原创 2015-12-28 10:02:12 · 2721 阅读 · 0 评论 -
【数据结构】求最小生成树的权值之和——Prim算法
题源: 北航14级6系数据结构课第四次作业【问题描述】 已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出,只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对。求该连通图的最小生成树的权值【输入形式】 第一行给出结点个数n和三元组的个数count,以下每行给出一个三元组,数之间用空格隔开。(注意这里顶点的序号是从1到n,原创 2015-12-01 18:03:08 · 21831 阅读 · 1 评论 -
【数据结构】【排序】求第k大的数——用谢尔排序实现
题源:*航*系数据结构作业【问题描述】 求n个数中第k大的数【输入形式】 第一行n k,第二行为n个数,都以空格分开【输出形式】 第k大的数【样例输入】10 318 21 11 26 12 2 9 33 43 28【样例输出】28【样例说明】【评分标准】 时间复杂度大于等于O(k*n)的方法得一半分原创 2015-12-25 17:10:31 · 665 阅读 · 0 评论 -
【算法】最长工作时间问题
#include #include struct worker { int startTime; int endTime; int mark;};int main(){ int n, n1 = 0, n2 = 0; int i, j; int LWT[50]={0}, LRT[50]={0}, maxLWT, maxLRT;原创 2015-12-25 18:13:50 · 1463 阅读 · 0 评论 -
模重复平方计算法(快速幂)【Python实现】<信安数论>
《信息安全数学基础》 陈恭亮版 2.5Python算法实现def fast_mod(x, n, m): a = 1 b = x while True: temp = n if n % 2 == 1 : a = a * b % m原创 2016-01-27 17:36:03 · 4738 阅读 · 2 评论 -
【算法学习】POJ3070——利用分治法来计算Fibonacci数列的值
DescriptionIn the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …An al...原创 2016-07-24 19:16:43 · 1681 阅读 · 1 评论 -
【算法学习】利用分治法计算x的n次幂
计算x^n,用普通的算法就是x乘n次的话,时间复杂度就是O(n) 利用分治法x ^ n = x^(n/2) *x(n/2) ( n是偶数) = x^((n-1)/2)*x^((n-1)/2)*x (x是奇数) 这样的话 T(n) = O(1) if x = 1 = T(n/2)+O(1) (此处原来是2*T(n/2)+O(1) ,但是可以只计算一次)根据主定理...原创 2016-07-17 23:42:38 · 19119 阅读 · 6 评论 -
【算法学习】最大子数组问题的分治法求解
最大子数组问题求解的是给定一个数组a[0...n-1],求出它的一个子数组使得其所有元素的和加起来最大如果使用暴力解法即枚举所有的子数组,则时间复杂度为O(n^2)采用分治法,对一段数组a[low.....high],求它的最大子数组,mid = (low+high)/ 2那么,a[low..high]的子数组有可能有三种分布的情况,假设子数组的上下届为i,j1) 在a的左部分,即 low &...原创 2016-08-28 08:53:57 · 928 阅读 · 0 评论 -
第一次poj的尝试——poj1423
#include #include #define PI 3.141592653589793239#define E 2.7182818284590452354int main(){ int n,i;/*n是表示输入数的个数*/ double a,b; int num[30]={0}; int ans,x; scanf("%d",&n);原创 2015-03-25 12:12:02 · 470 阅读 · 0 评论