《算法笔记》
《算法笔记》胡凡
devilboy恶魔男孩
这个作者很懒,什么都没留下…
展开
-
《算法笔记》10.2 图的存储
一.邻接矩阵G[i][j] = 点 i 与点 j 之间的边的权值(或由 0/1 表示是否存在);适用于顶点数目不太大(<=1000)的图;二.邻接表Adj[i] 存放顶点 i 的所有出边组成的列表,储存边的终点编号和边权;如何实现:1.链表;2.vector:示例一:vector<int> Adj[N];Adj[1].push_back(3);示例二:struct Node { int v; // 终点编号 int w; //边权 };vector<原创 2020-05-10 00:25:47 · 129 阅读 · 0 评论 -
《算法笔记》10.1 图的定义和相关术语
1.G(V,E):表示图G的顶点集为V,边集为E;2.顶点的度:和该顶点相连的边的条数;顶点的出度:出边条数;顶点的入度:入边条数;3.点权:顶点的权值;边权:边的权值;原创 2020-05-09 23:56:52 · 124 阅读 · 0 评论 -
《算法笔记》9.8 哈夫曼树
一.定义叶子节点的带权路径长度:权值 * 根结点到叶子节点的路径长度;树的带权路径长度:所有叶子节点的带权路径长度的和;哈夫曼树:叶子节点的权值一样的树中带权路径长度最小的树;构造哈夫曼树:不断合并两个权值相加最小的元素,直到只剩下一个元素为止;示例:合并果子问题#include<cstdio>#include<queue>using namespace std;priority_queue<long long, vector<long long>原创 2020-05-09 23:22:55 · 179 阅读 · 0 评论 -
《算法笔记》9.7 堆
一.定义大顶堆:根结点最大的完全二叉树;小顶堆:根结点最小的完全二叉树;(以下以大顶堆为例)用数组的形式定义堆:const int maxn = 100;int n;int heap[maxn];二.基本操作1.建堆:a.向下调整:(将当前结点与它的左右孩子节点比较,按照大小关系交换,若交换则继续与孩子节点比较)void downAdjust(int low, int hi...原创 2020-05-05 19:10:15 · 163 阅读 · 0 评论 -
《算法笔记》9.6 并查集
一.定义实现:int father[N];father[i] = j; 表示 j 的父亲结点是 i;father[i] = i; 表示元素 i 是该集合的根结点;二.基本操作1.初始化for(int i = 1; i <= n; i++) father[i] = i;2.查找非递归实现:int findFather(int x) { while(x != father[x...原创 2020-05-05 11:39:52 · 140 阅读 · 0 评论 -
《算法笔记》9.5 平衡二叉树
一.定义平衡因子:左子树和右子树的高度差;平衡二叉树:对任意结点,其平衡因子的绝对值不超过1的二叉查找树;struct node { int v, height; // height:以当前结点为根结点的子树高度 node* lchild; node* rchild;}二.基本操作1.生成新结点:node* newNode(int v) { node* Node = new...原创 2020-05-04 15:24:48 · 164 阅读 · 0 评论 -
《算法笔记》9.4 二叉查找树
一.定义1.二叉查找树可以是一棵空树;2.左子树所有结点的数据域均小于等于根结点,右子树所有结点的数据域均大于等于根结点;二.基本操作1.查找操作void search(node* root, int x) { if(root == NULL) { printf("search failed\n"); return; } if(x == root->data) pri...原创 2020-05-03 12:51:19 · 161 阅读 · 1 评论 -
《算法笔记》9.3 树的遍历
一.树的静态写法1.结构体:struct node { typename data; 1.int child[maxn]; //指针域,maxn 为结点上限个数 2.vector child; //防止开辟的空间过大}Node[maxn];2.新建结点:int index = 0;int newNode(int v) { Node[index].data = v; Nod...原创 2020-04-27 23:18:21 · 189 阅读 · 0 评论 -
《算法笔记》9.2 二叉树的遍历
一.先序遍历根结点——> 左子树——> 右子树void preorder(node* root) { if(root == NULL) return; printf("%d\n", root->data); preorder(root->lchild); preorder(root->rchild);}性质:序列的第一个一定是根结点;二.中序遍历...原创 2020-04-27 16:16:10 · 194 阅读 · 0 评论 -
《算法笔记》9.1 树与二叉树
一.树的定义与性质1.空树:没有结点的树;2.树的层次:根结点为第一层,根节点子树的根节点为第二层;3.度:结点子树的棵树,叶结点度为0;4.有 n 个结点的树,边数为 n - 1;5.结点的深度:从根结点(深度为1)开始,自顶向下;结点的高度:从叶结点(高度为1)开始,自底向上;二.二叉树的递归定义1.第一种情况:二叉树是空树;第二种情况:二叉树由根节点、左子树、右子树构成;2...原创 2020-04-26 23:26:11 · 199 阅读 · 1 评论 -
《算法笔记》8.2 广度优先搜索
一.广度优先搜索1.基本写法:void BFS(int s) { queue<int> q; q.push(s); while(!q.empty()) { 取出队首元素 top; 访问队首元素 top; 将队首元素出队; 将下一层结点中未曾入队的结点全部入队; }}2.示例一:代码:#include<cstdio>#include&...原创 2020-04-25 22:48:48 · 142 阅读 · 0 评论 -
《算法笔记》8.1 深度优先搜索
一.深度优先搜索枚举所有完整路径以遍历所有情况;实现方式:递归 / 非递归;示例一:void DFS(int index, int sumW, int sumC) { //终点: if(index == n) return; //不选第 index 件物品: DFS(index + 1, sumW, sumC); //选第 index 件物品: if(w[index] + ...原创 2020-04-24 22:59:45 · 161 阅读 · 1 评论 -
《算法笔记》7.3 链表
一.链表的概念1.分为数据域和指针域:struct node { typename datd; //数据域 node* next; //指针域};2.链表分为带头结点和不带头结点(头结点:data 不存放数据,next 指向第一个数据域有内容的结点);二.为新结点申请动态内存空间1.malloc函数:(C语言)头文件:#include<stdlib.h>;返回类...原创 2020-04-24 00:03:56 · 238 阅读 · 0 评论 -
《算法笔记》7.1栈
一.定义:后进先出栈顶指针:始终指向栈的最上方元素,栈空时TOP为 -1;二.常见操作(数组实现)1.clear():void clear() { TOP = -1;}2.size():int size() { return TOP + 1;}3.empty():bool empty() { if(TOP == -1) return true; else retur...原创 2020-04-15 16:33:08 · 127 阅读 · 0 评论 -
《算法笔记》7.2 队列
一.定义:先进先出队列为空时 front = -1,rear = -1;(front指向第一个元素的前一个位置)二.常用操作(数组实现)1.clear():void clear() { front = rear = -1;}2.size()int size() { return rear - front;}3.empty()bool empty() { if(fro...原创 2020-04-15 16:30:38 · 137 阅读 · 0 评论 -
《算法笔记》6.7 stack
一.stack容器内元素的访问只能通过 top() 来访问栈顶元素;二.常用函数1.push():push(x) 将 x 入栈;2.top();3.pop():pop() 弹出栈顶元素4.empty();5.size();三.常见用途模拟实现递归,防止程序对栈内存的限制而导致运行出错;...原创 2020-04-15 10:45:40 · 98 阅读 · 0 评论 -
《算法笔记》6.5 queue
一.queue 的定义1.头文件;2.命名空间;3.queue 的定义:queue<typename> name;一个先进先出的容器;二.元素的访问只能通过 front() 访问队首元素和 back() 访问队尾元素,示例:for(int i = 1; i < 6; i++) q.push(i);printf("%d %d", q.front(), q.back(...原创 2020-04-10 13:06:11 · 116 阅读 · 0 评论 -
《算法笔记》6.4 map
一.map 的定义1.用途:可以将任何基本类型(包括STL容器)映射到任何基本类型;2.map 头文件;3.命名空间;4.map 的定义:map<typename1, typename2> mp;<键—,—>值>,数组不能做键值;二.元素的访问1.通过下标访问:和访问普通数组一样(map 中的键是唯一的),示例:map<char, int>...原创 2020-04-10 12:02:39 · 222 阅读 · 0 评论 -
《算法笔记》6.2 set
一.set 的定义1.头文件:#include<set>2.命名空间:using namespace std3.定义:set<typename> name;4.定义set 数组:set<typename> Arrayname[arrayzsize]二.set 容器内元素的访问只能通过迭代器访问:set<typename>::iterato...原创 2020-04-09 10:34:15 · 136 阅读 · 0 评论 -
《算法笔记》6.1 vector
一. vector 的定义1.头文件:#include< vector >2.命名空间:using namespace std;3.定义:vector<typename> name;若 typename 也是一个STL容器,要在> >间加空格,例如:vector<vector<int> > name;4.定义 vector 数组...原创 2020-04-08 21:25:48 · 149 阅读 · 0 评论 -
《算法笔记》4.7 其他高效技巧和算法
一.打表在程序中一次性计算出所有需要用到的结果,之后可直接取这些结果;二.活用递推正在计算的结果可以通过以前计算的结果得到;三.随机选择算法如何从一个无序的数组中求出第 K 大的数(数组中元素各不相同)代码:int randSelect(int A[], int left, int right, int K) { if(left == right) return A[left];...原创 2020-04-08 11:02:05 · 184 阅读 · 0 评论 -
《算法笔记》4.6 two pointers
1.PAT B1030思路:若 A[j] <= A[i] * p,则 A[k] <= A[i] * p (i <= k <= j) ,由这个性质引导我们往 two pointers 思想去考虑;第一次循环得到了count1,在第二次循环中,若 j 满足 A[j] <= A[i] * p,则可以继续向右走,得到 count2(>=count1),若不满足,则...原创 2020-04-07 11:31:50 · 140 阅读 · 0 评论 -
《算法笔记》4.5二分
一.二分查找1.在一个有序序列 A 中找出给定数 x 的位置(初始下标区间是 [left , right] )#include<cstdio>using namespace std ;int binarySearch(int A[] , int left , int right , int x) { int mid ; while(left <= right) { ...原创 2020-04-06 09:18:13 · 187 阅读 · 0 评论 -
《算法笔记》4.4贪心
一.贪心算法考虑当前状态下局部最优(或较优)的策略;二.题目1.PAT B1020注意:1).排名直接体现在数组下标中,无需储存在结构体中;代码:#include<cstdio>#include<algorithm>using namespace std ;struct mooncake { double store ; double sell ;...原创 2020-04-03 10:11:18 · 208 阅读 · 0 评论 -
《算法笔记》4.3递归
1.全排列:方法一:#include<cstdio>using namespace std ;int n , P[11] ;void generateP(int index) { if(index == n) { for(int i = 0 ; i < n ; i ++) printf("%d",P[i]) ; printf("\n") ; } else ...原创 2020-04-01 23:26:51 · 153 阅读 · 0 评论 -
《算法笔记》4.2散列
一.整数的散列把输入的数作为数组下标来对这个数的性质进行统计;示例1:#include<cstdio>const int maxn = 100010 ;bool hashTable[maxn] = {false} ;int main() { int n , m , x ; scanf("%d%d",&n,&m) ; for(int i = 0 ; i ...原创 2020-04-01 15:10:44 · 210 阅读 · 0 评论 -
《算法笔记》4.1排序
一.选择排序思路:代码:void selectSort() { for(int i = 1 ; i <= n ; i ++) { int k = i ; for(int j = i ; j <= n ; j ++) { if(A[j] < A[k]) k = j ; } int temp = A[i] ; A[i] = A[k] ; A[k...原创 2020-04-06 09:18:48 · 296 阅读 · 0 评论