基础算法
文章平均质量分 75
数据结构和算法
山顶夕景
实践出真知
展开
-
数据结构学习笔记
1.二分基本的查询下标的方法为(首下标+尾下标)/2,如果该下标非查询值,要剔除后在左边或右边继续循环。记住:把已经查询的值剔除,剔除,剔除例:若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为______(中国科学院大学2012) DA. 1,2,3 B. 9,5,2,3C....原创 2020-03-11 21:58:35 · 6477 阅读 · 4 评论 -
各排序算法比较
各个排序算法的时间复杂度简记:一般的都是最好n最坏n方四个特例快排因为快所以好的时候可以达到nlogn堆跟归并一样好坏都是nlogn但归并需要空间另外还有一个特殊的是选择因为它每次都要挑最大最小所以都是n方以上。...原创 2020-02-25 21:43:08 · 2915 阅读 · 2 评论 -
408算法模板
一.线性表1.1线性表基本定义1二.树2.1二叉树建立12.2二叉树静态表示12.3二叉查找树(BST树)12.4平衡二叉树(AVL树)12.5二叉树遍历12.6根据遍历构造二叉树12.7树的应用及遍历12.8树的应用——并查集12.9二叉树的应用——堆及堆排序1三.图3.1深度优先遍历...原创 2020-02-22 14:01:11 · 2577 阅读 · 0 评论 -
10G数中找到前5G大的数
堆排序(转换为求前5G大的元素)处理海量数据常用【堆排序】:(1)不需要一次性将所有数据加载到内存中;(2)不用对所有元素进行排序,只需要和堆的根结点比较大小即可;(3)对于海量数据而言,要求前k小/大的数,我们只需要构建一个k个大小的堆,然后将读入的数依次和根节点比较就行了(当然这里的前提是内存需要存的下k个数)最大堆求前n小,最小堆求前n大。1、前k小:构建一个k个数的最大堆,当读取的数大于根节点时,舍弃;当读取的数小于根节点时,替换根节点,重新塑造最大堆,然后继续读取,最后读取完所有的数原创 2021-01-17 21:04:26 · 779 阅读 · 2 评论 -
满二叉树.根据前序求后序
#include <cstdio> #include <iostream>using namespace std;#define N 100void pre2post(char pre[] , int preL,int preR , char post[] , int postL , int postR){ if(preL <= preR)...原创 2019-07-20 11:18:26 · 332 阅读 · 0 评论 -
二叉树层次遍历
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *//*二...原创 2019-07-19 15:24:56 · 614 阅读 · 0 评论 -
寻找二叉树公共祖先结点递归实现
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *//*寻...原创 2019-07-20 07:41:20 · 1901 阅读 · 0 评论 -
2019年链式队列大题
【知识回顾】【真题】请设计一个队列,满足:(1)初始时队列为空;(2)入队时,允许增加队列占用空间;(3)出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;(4)入队操作和出队操作的时间负责度始终保持为O(1)。第一问:选链式/顺序存储结构顺序存储无法满足(2)的“队列占用空间随着入队而增加”,(1)容易满足;链式存储方便开辟新空间,要求(2)容易满足;要求(3)出队后的结点并不真正释放,用队头指针指向新的队头结点,新元素入队时,有空余结点则无.原创 2020-08-18 23:26:52 · 2475 阅读 · 0 评论 -
AOE专题
一.AOE本质每一个事件的发生表示以该事件相应的顶点为弧头所代表的活动都完成,以该事件相应的顶点的弧尾的弧所代表的活动可以开始。二.AOE举例Ve:从始点开始到各顶点的最大(与本质联系)路径长度。(从前往后,取最大值,Ve[0]=0即起始值为0)Ve[j]=Max{Ve[i]+dis<i,j>}Vl:在不推迟整个工期前提下,事件允许的最晚时间(从后往前,取小值,Vl[n]=Ve[n])Vl[i]=Min{Vl-dis<i,j>} A B...原创 2020-07-28 19:20:23 · 1784 阅读 · 2 评论 -
前正后负
1、前正后负(2018吉林大学941)一个长度为n的数组由负数、0、正数组成。编写函数,将其重新排列为前段都是负数,后段均为非负数(正数和0都为非负数)的结构。要求时间复杂度为O( n )。本题的解题思想:从一个无序的数组变成一个有序的数组,首先想到的是遇到正数和0后移,然后整体前移,遇负数位置不动,但是考虑到时间复杂度O(n),因此只能有一层循环,所以就想到建一个新数组,开始遍历,遇到正数放后面同时后面的指针前移,遇负数方前面同时前面的指针后移,直到将a[n]遍历完成为止。#include原创 2020-06-06 07:52:53 · 920 阅读 · 0 评论 -
2016年408算法大题
已知由n(n>=2)个正整数构成的集合A ,将其划分成两个不相交的子集A1和A2,元素个数分别为n1和n2,A1和A2中元素之和分别为S1和S2。设计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大。要求:1)给出算法的基本设计思想。2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。3)说明你所设计算法的平均时间复杂度和空间复杂度。【解析】(1)根据快速排序的思想,把找到最佳的划分,把最小的[n/2]个数放到A1,其余的数放到A2。分组结果即为题意原创 2020-05-10 14:28:43 · 4831 阅读 · 0 评论 -
2015年408算法题
typedef struct node{ int data; struct node *link;}NODE;typedef NODE *PNODE; void func (PNODE h,int n){ PNODE p=h,r; int *q,m; q=(int *)malloc(sizeof(int)*(n+1)); for(int i=0;i<...原创 2019-12-06 00:53:00 · 1102 阅读 · 0 评论 -
快速排序漫画
漫画来源:http://ahalei.blog.51cto.com/4767671/1365285原创 2020-04-26 18:23:56 · 854 阅读 · 0 评论 -
KMP求解next数组
转存失败重新上传取消转存失败重新上传取消转存失败重新上传取消转存失败重新上传取消PS:以上截图自《王道——数据结构》原创 2020-04-17 17:48:58 · 763 阅读 · 0 评论 -
DFS(二)
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#include<vector>#inclu...原创 2020-01-17 15:30:47 · 414 阅读 · 0 评论 -
Dijkstra模板
//n为顶点数,m为边数,st和ed分别为起点和终点//G为距离矩阵,cost为花费矩阵//d[]记录最短距离,minCost记录最短路径上的最小花费const int MAXV=510;//最大顶点数const int INF=1000000000;//无穷大int n,m,st,ed,G[MAXV][MAXV],cost[MAXV][MAXV];int d[MAXV],min...原创 2020-01-20 22:24:18 · 619 阅读 · 0 评论 -
DFS(一)
使用场景输入数据:如果是递归数据结构,如单链表,二叉树,集合,则一定可以用DFS;如果是非递归数据结构,如一维数组,二维数组,字符串,图,则概率小一点。状态转换图:树或图求解目标:必须要走到最深(如树,必须走到叶结点)才能得到一个解,这种情况适合用DFS思考的步骤1.是求路径条数,还是路径本身(或动作序列)?DFS最常见的三个问题,求可行解的总数,求一个可行解,求所有可行解...原创 2020-01-07 00:00:03 · 1017 阅读 · 0 评论