算法与数据结构
算法的理解总结
我辈当自强
努力学习,努力生活,努力成为对社会有用的人。
展开
-
有序向量和无序向量对比
原创 2020-06-28 21:13:09 · 804 阅读 · 0 评论 -
算法--第二章向量
原创 2020-06-28 09:26:31 · 316 阅读 · 0 评论 -
算法---第一章
1、Hailstone问题(又名3n+1问题)中Hailstone(n)的计算程序是Hailstone问题至今仍未得到证明,即至今没有人证明对所有的正整数,Hailstone(n)过程都可以终止。3n+1问题详解:https://blog.csdn.net/ziyuzhao123/article/details/12953983?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159326366619195162564997%2522%原创 2020-06-27 22:04:44 · 1611 阅读 · 0 评论 -
算法习题1
原创 2020-06-23 20:12:59 · 113 阅读 · 0 评论 -
红黑树习题
1、红黑树中已经有n个数据,寻找某个key是否存在的时间复杂度为()。o(logn)2、关于红黑树和AVL树,以下哪种说法不正确?正确答案: D两者都属于自平衡二叉树两者查找,插入,删除的时间复杂度相同包含n个内部节点的红黑树的高度是O(log(n))JDK的TreeMap是一个AVL的实现...原创 2020-06-17 12:08:38 · 2502 阅读 · 0 评论 -
栈的应用
1、进制转换https://blog.csdn.net/qq_43699776/article/details/1055499392、括号匹配https://blog.csdn.net/qq_43699776/article/details/106422800?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159227434119726869061093%2522%252C%2522scm%2522%253A%252220140713原创 2020-06-16 12:11:51 · 129 阅读 · 0 评论 -
散列表习题
1、考虑key的集合S = {0, 8, 16, 24, 32, 40, 48, 56, 64}用除余法构造的散列函数h1(key) = key % 12h2(key) = key % 11h1将S映射到的值域有几个元素?____3h2将S映射到的值域有几个元素?____92、散列表的规模是素数,用开放定址+平方试探法排解冲突,若要保证新的词条能够顺利插入,散列表的装填因子不能超过(请填十进制小数)0.53、对[0, 11)中的整数{ 10, 4, 2, 9, 3,原创 2020-06-15 12:20:16 · 1891 阅读 · 1 评论 -
图的应用-----关键路径
1、相关定义概念详解https://blog.csdn.net/tuwenqi2013/article/details/52795710?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-32、看来2篇天勤的考研数据结构讲解总结如下:1、先求出拓扑排序2、求所有事件最早发生时间 与以该事件为始的弧的活动的最早开始时间相同3、求所有活动最早发生时间4、求所有事件最迟发生时间 ==MIN[以该事件为尾的弧的活动的最迟开始时间,原创 2020-06-09 15:59:09 · 637 阅读 · 0 评论 -
快速排序
一、快速排序1、知识点:每次的枢轴都把表等分为长度相近的两个子表时,速度是最快的;当表本身已经有序或逆序时,速度最慢。二、随机快速排序:三、例题1、荷兰国旗问题:设有一个仅由红、白、蓝三种颜色的条块组成的条块序列,请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。typedef enum{RED,WHITE,BLUE} color;//设置枚举数组 void Flag_Arrange(color a[],int n){ int i=0,j=0,k=原创 2020-05-28 11:10:03 · 147 阅读 · 0 评论 -
串匹配算法总结2
4、BM算法该算法主要利用坏字符规则和好后缀规则进行转换。所谓坏字符规则,是指不能匹配时的字符在待匹配字串中从右边数的位置;而好后缀规则则是指子串中从该不匹配位置后面所有字符(都是已匹配字符)再次在字串中出现的位置(k),其中s[k,k+1,—,k+len-j-1] = s[j+1, j+1,—,len-1], 并且s[k-1] != [j] || s[k-1] = $, 其中$表示增补的字符,可以与任何字符相等。#include <algorithm>#include <stri原创 2020-05-25 17:15:43 · 258 阅读 · 1 评论 -
串匹配习题
1、你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a","go"是"b"),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。示例 1:输入: pattern = "abba", value = "dogcatcatdog"输出: t原创 2020-05-25 16:28:59 · 301 阅读 · 0 评论 -
串匹配算法总结
1、BF(暴力搜索)匹配时间复杂度O(N*M)主要过程:从原字符串开始搜索,若出现不能匹配,则从原搜索位置+1继续。int bf(const char *text, const char *find) { if (text == '/0' || find == '/0') return -1; int find_len = strlen(find); int text_len = strlen(text); if (text_le原创 2020-05-21 19:11:47 · 286 阅读 · 0 评论 -
串的匹配KMP
1、详解http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html2、主字符串的子字符串位置include <stdio.h>#include <stdlib.h>#include <string.h>#define STRING_INIT_SIZE 100 //串初始长度 int Index(char *S, char原创 2020-05-20 17:49:49 · 161 阅读 · 0 评论 -
乘积最大子数组
1、乘积最大子数组给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。int maxProduct(vector<int>& nums) { vector<int> m原创 2020-05-18 10:42:35 · 148 阅读 · 0 评论 -
平衡二叉树习题
1、给定一个二叉树,判断它是否是高度平衡的二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4返回 false 。class Solution { public boolean原创 2020-05-18 09:56:40 · 2714 阅读 · 0 评论 -
AVL平衡二叉树知识点
1、定义任意结点的左、右子树高度差的绝对值不超过1,将这样的二叉树称为平衡二叉树。左子树与右子树的高度差为该节点的平衡因子,平衡因子值只能是-1,1,02、插入A、二叉排序树保证平衡的基本思想:每当在二叉排序树中插入(或删除)一个结点时,首先检查其插入路径上的结点是否因为此次操作而导致了不平衡。若导致了不平衡,则先找到插入路径上离插入结点最近的平衡因子的绝对值大于1的结点A,再对以A为根的子树,在保持二叉排序树特性的前提下,调整各结点的位置关系,使之重新达到平衡。B、在新节点插入后,若造成查原创 2020-05-18 09:11:20 · 189 阅读 · 0 评论 -
堆2(完全二叉树)
1、最后一块石头的重量有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。 示例:输入:[2,7,4,1,8,1]输出:1解释:先选出原创 2020-05-15 15:40:56 · 138 阅读 · 0 评论 -
堆1(完全二叉树)
一、知识点1、完全二叉树=完全二叉堆大顶堆根节点一定是最大值2、上滤3、下滤4、建立最大堆(大根堆)算法堆(Heap)是一个可以被看成近似完全二叉树的数组。树上的每一个结点对应数组的一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。—— 来自:《算法导论》堆包括最大堆和最小堆:最大堆的每一个节点(除了根结点)的值不大于其父节点;最小堆的每一个节点(除了根结点)的值不小于其父节点。堆常见的操作:HEAPIFY 建堆:把一个乱序的数组变成堆结构的数组,时间复杂度为 O(n)O原创 2020-05-14 12:55:43 · 644 阅读 · 0 评论 -
树习题2
1、二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求值的顺序保持不变,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。返回转换后的单向链表的头节点。示例:输入: [4,2,5,1,3,null,6,0]输出: [0,null,1,null,2,null,3,null,4,null,5,null,6]提示:节点数量不会超过 100000。思路:二叉搜索树的层序遍历/** * D原创 2020-05-12 23:06:01 · 310 阅读 · 0 评论 -
二叉树习题
1、已知一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近的公共祖先结点的值。ElemType Comm_Ancestor(SqTree T,int i,int j){ if(T[i]!='#'&&T[j]!='#'){ while(i!=j){//结点存在 if(i>j)//两个编号不同时循环 i=i/2;//向上找i的祖先 else j=j/2;//向下找j的祖先 } return T[i]; }原创 2020-05-09 11:18:06 · 475 阅读 · 0 评论 -
二叉搜索树BST
1、定义左子树结点值<根节点值<右子树结点值递增的有序序列2、查找BSTNode *BST_Search(BiTree T,ElemType key){ while(T!=NULL&&key!=T->data){ if(key<T->data) T=T->lchild; else T=T->rchild; } return T; } 时间复杂度不超过O(h)树高3、插入递归int BST_Inser(BiTree原创 2020-05-08 22:13:32 · 202 阅读 · 0 评论 -
线索二叉树
引入线索二叉树是为了加快查找结点前驱和后继的速度。1、概念typedef struct ThreadNode{ ElemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;}ThreadNode,*ThreadTree;以这种结点结构构成的二叉链表作为二叉树的存储结构,称为线索链表,其中指向结点前驱和后继的指针称为线索。加上线索的二叉树称线索二叉树。2、中序线索二叉树的构造void InThread(ThreadTree原创 2020-05-08 21:23:48 · 344 阅读 · 0 评论 -
树与二叉树
一、树原创 2020-05-08 20:57:45 · 132 阅读 · 0 评论 -
hufuman树/高精度加法/阶乘计算/阶乘计算
1、判断闰年public class Runyear { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); if(n%400==0) { System.out.println("yes"); } ...原创 2019-11-26 22:43:28 · 109 阅读 · 0 评论 -
链表的增删改查
1、c++版本https://blog.csdn.net/qq_41722524/article/details/866530492、C语言https://www.cnblogs.com/kangge/p/8316844.html原创 2020-04-06 12:44:08 · 92 阅读 · 0 评论 -
huffman树(最优二叉树)和huffman编码
1、哈夫曼树的定义在许多实际应用中,数中结点常常被赋予一个表示某种意义的数值,称为该结点的权。从树根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积称为该结点的带权路径长度。数中所有叶结点的带权路径长度之和称为该树的带权路径长度...原创 2020-04-01 15:06:27 · 439 阅读 · 0 评论 -
回形取数
问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。输出格式 输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。样例输入3 31 2 34 5 67...原创 2019-11-27 21:25:16 · 95 阅读 · 0 评论 -
回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯” 返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为 “回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用...原创 2019-11-26 21:55:56 · 162 阅读 · 0 评论 -
排序算法总结
1、 选择排序(视频讲解,生动形象,http://v.youku.com/v_show/id_XMjU4NTY5NTcy.html)原理:先将第一个位值上的数跟之后所有位置上的数依次进行比较,如果第一个位置上的数比第二个位置上的数大,则进行互换,然后继续将第一个位置上的数与第三个位置上的数进行比较,经过一轮的比较后,第一个位值上的数就是所有数中最小的一个,接着将第二个位置上的数与之后所有位置...原创 2019-11-26 21:50:02 · 91 阅读 · 0 评论 -
线性表1
2.1线性表2.1.1线性表的抽象数据结构1)线性表是n个数据元素组成的有序序列k0,k1,…,k(n-1),其中:k0为开始结点,没有前驱,仅有一个后继;k(n-1)为终端结点,没有后继。2)线性表的特点表中元素的个数有限。...原创 2019-11-16 10:15:45 · 142 阅读 · 0 评论 -
链表习题(1)
1、设计一个递归算法,删除不带头节点的单链表L中所有值为x的结点void Del_X_3(LinkList &L,ElemType x) { LNode *p; if(L=null) return ; if(L->data==x) { p=L; L=L->next; free(p); Del_X_3(L,x); }else{...原创 2019-11-12 15:48:28 · 493 阅读 · 0 评论