算法
文章平均质量分 73
jiangxt211
这个作者很懒,什么都没留下…
展开
-
图(五):最短路径
定义:在一幅加权有向图中,从顶点s到顶点t的最短路径是所有从s到t的路径中权重最小者。(单源最短路径、单终点最短路径、单对顶点最短路径、每对顶点最短路径)引理:最短路径的子路径是最短路径。当且仅当加权有向图中至少存在一条从s到v的有向图路径且所有从s到v的有向路径上的任意顶点都不存在于任何负权重环中时,s到v的最短路径才是存在的。松弛(relaxation)操作Bellman-Ford...原创 2020-03-06 21:51:46 · 473 阅读 · 0 评论 -
图(四):最小生成树
最小生成树即权值最小的生成树。(无环,连接所有顶点的图,一定是树,即生成树(spanning tree))GENERIC-MST在算法的每一步中,确定一条边(u, v),使得将它加入集合A后,A&{(u,v)}仍然是某一最小生成树的子集。称这样的边为A的安全边(safe edge)。算法的关键是如何寻找安全边。理解:cut、light edge、crosses、resp...原创 2020-03-05 11:48:19 · 692 阅读 · 0 评论 -
图(三):图的遍历(BFS&DFS)
1、广度优先搜索(Breadth-first search)BFS是最简单的图搜索算法之一,也是很多重要的图算法的原型。在Prim最小生成树算法和Dijkstra单源最短路径算法中,都采用了与BFS类似的思想。BSF始终是将已发现和未发现顶点之间的边界,沿着其广度方向向外扩展。即算法首先会发现和s距离为k的所有顶点,然后才会发现和s距离为k+1的其他顶点。(层序遍历)广度优先搜索构造了一棵广...原创 2020-03-03 14:43:22 · 308 阅读 · 0 评论 -
图(二):图的表示
图的表示(1)邻接矩阵(adjacency matrix)(2)邻接表(adjacency lists)图G=(V, E)的邻接表表示由一个包含|V|个链表的数组Adj所组成,其中每个链表对应于V中的一个顶点。对于每一个u属于V,邻接表Adj[u]包含所有满足条件(u, v)属于E的顶点v。(3)邻接集(adjacency sets)(4)边数组(array of edges):所有边构...原创 2020-03-03 12:25:43 · 312 阅读 · 0 评论 -
图(一):基本概念
图是一组顶点和连接这些顶点的边的集合。在图中,路径是由边顺序连接的一系列顶点。简单路径是一条没有重复顶点的路径。环是一条至少含有一条边且起点和终点相同的路径。简单环是一条(除了起点和终点必须相同之外)不含有重复顶点和边的环。路径或者环的长度为其中所包含的边数。如果从任意一个顶点都存在一条路径到达另一个任意顶点,我们称这幅图是连通图。一副非连通的图由若干连通的部分组成,它们都是其极大连通子图。树...原创 2020-02-28 16:14:43 · 422 阅读 · 0 评论 -
Union-Find算法(Java)
union-find算法用于处理动态连通分量问题。(1)处理连通分量的问题1)找到元素所属的连通分量;2)判断两元素是否属于同一连通分量;3)合并两元素(连通分量)。(2)API(3)实现使用id[]数组来放置元素所属连通分量的标志(id),通过三种不同的实现来展示对算法改进的过程。1)quick-find2)quick-unionid[]数组用父链接的形式表示一片树林。...原创 2020-01-01 23:58:51 · 497 阅读 · 0 评论 -
查找算法
#include #include // 二分查找法int BinarySearch(int arr[], int n, int x){ int left = 0; int right = n - 1; int mid = 0; while (left <= right) { mid = (left + right) / 2; // mid = left + (righ原创 2017-03-01 17:50:38 · 189 阅读 · 0 评论 -
排序算法
两个数的交换void swap(int arr[], int i, int j){int tmp;tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}// 当交换的两个数相等或与自身交换时,下面两种实现不能用void swap(int arr[], int i, int j){arr[i] ^= arr[j];arr原创 2017-03-01 16:27:53 · 206 阅读 · 0 评论 -
单链表
链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存放到下一个节点的指针(Pointer)。使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表有很多种不同的类型:单向链表,双向...原创 2014-06-23 11:56:44 · 503 阅读 · 0 评论 -
队列(双链表实现)
队列(queue)需要满足FIFO(First In First Out)的要求。在是使用双链表实现队列时,需要注意下面三种情况:1)队列为空;2)队列只有一个元素;3)队列有多个元素。进栈(Enqueue)出栈(Dequeue)#pragma once#ifndef _MY_QUEUE_H#define _MY_QUEUE_Htypedef struct node { struct n...原创 2017-03-15 14:27:32 · 627 阅读 · 0 评论 -
堆(heap)
1、堆(heap)堆数据结构是一种数组对象(也可以是链表),可以被看作一棵完全二叉树(二叉堆)。堆总是满足下列性质:1)堆中某个节点的值总是不大于或不小于其父节点的值;(在最大堆(max-heap)中,父节点的值不小于每一个子节点的值。在最小堆(min-heap)中,父节点的值不大于每一个子节点的值。)2)堆总是一棵完全二叉树。2、操作获取最大(最小)元素删除最大(最小)元素:下沉...原创 2014-08-25 21:24:23 · 504 阅读 · 0 评论 -
双链表(一)
双链表在链表这种数据结构中,各对象按线性顺序排序。数组的线性序是有数组的下标决定的,而链表中的顺序是由各对象中的指针所决定的。链表可以用来简单而灵活地表示动态集合。一个链表可以呈现为好几种形式。它可以是单链接的或双链接的,已排序的或未排序的,环形的或非环形的。双链表(a doubly linked list)的每一个元素都是一个对象。每个对象包含一个关键字域和两个指针域:next...原创 2014-06-16 16:53:24 · 592 阅读 · 0 评论 -
双链表(二)
#ifndef _MY_HLIST_H#define _MY_HLIST_Htypedef struct hlist_node { struct hlist_node *next; /* next element */ struct hlist_node **pprev; /* address of previous next element */} HNODE;t...原创 2018-11-11 17:56:34 · 164 阅读 · 0 评论 -
散列表(hash table)
A hash table generalizes the simpler notion of an ordinary array. Directly addressing into an ordinary array makes effective use of our ability to examine anarbitrary position in an array in O(1)tim...原创 2018-11-11 21:33:24 · 288 阅读 · 0 评论 -
二叉查找树(二)
The search tree data structure supports many dynamic-set operations, including SEARCH, MINIMUM, MAXIMUM, PREDECESSOR, SUCCESSOR, INSERT, and DELETE. Thus, we can use a search tree both as a dictionary...原创 2018-11-25 23:00:44 · 167 阅读 · 0 评论 -
泛型链表
使用c语言实现泛型链表主要是将链表的操作与具体的对象进行隔离。即链表的操作,只对链结点进行,与具体的对象无关。用户可以通过链结点获取具体的对象,完成想要的操作。通过链结点获取对象有两种常用的方式:(1)通过链结点的位置计算出该对象的位置;(2)直接在链结点中包含该对象的位置(指针)。具体链表操作的实现可以参考:https://blog.csdn.net/jiangxt211/artic...原创 2019-09-15 11:05:07 · 302 阅读 · 0 评论 -
RSA算法原理(二)
https://en.wikipedia.org/wiki/RSA_(cryptosystem)http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html作者: 阮一峰日期: 2013年7月 4日上一次,我介绍了一些数论知识。有了这些知识,我们就可以看懂RS转载 2015-10-12 23:35:36 · 267 阅读 · 0 评论 -
Base64笔记
昨天的《MIME笔记》中提到,MIME主要使用两种编码转换方式----Quoted-printable和Base64----将8位的非英语字符转化为7位的ASCII字符。虽然这样的初衷,是为了满足电子邮件中不能直接使用非ASCII码字符的规定,但是也有其他重要的意义:a)所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑;b)能够对文本进行简单的加密。转载 2015-10-12 23:03:07 · 232 阅读 · 0 评论 -
Huffman codes
#include#includetypedef struct hmap { char c; int freq;} HMap; typedef struct hnode { char c; int freq; struct hnode *left; struct hnode *right;} HNode, *HTree;// 用数组遍历可能实现更简单一些// #def原创 2014-08-17 22:21:07 · 607 阅读 · 0 评论 -
二叉树遍历访问
二叉树遍历 (主要内容来自Wikipedia)In computer science, tree traversal (also known as tree search) refers to the process of visiting (examining and/or updating) each node in a tree data structure, exact原创 2014-07-13 13:14:15 · 645 阅读 · 0 评论 -
斐波那契堆
斐波那契堆1、斐波那契堆的结构与二项堆一样,斐波那契堆是由一组最小堆的有序树构成,但堆中的树并不一定是二项树。与二项堆中树都是有序的不同,斐波那契堆中的树都是有根而无序的。原创 2014-08-05 22:52:58 · 432 阅读 · 0 评论 -
计数排序
void StableSort(int *A, int size, int radix, int d) // digit{ int *C = (int *)malloc(radix * sizeof(int)); if (!C) { printf("C malloc error\n"); return ; } int *B = (int *)malloc(size原创 2014-06-06 11:08:15 · 334 阅读 · 0 评论 -
最大值与最小值
#include #include #define BUFSIZE 8// 2n-2次比较void GetMinMax(int *arr, int n, int *min, int *max){ *min = *max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < *min) *min = arr[i];原创 2014-06-08 21:59:58 · 534 阅读 · 0 评论 -
BucketSort
#include #include typedef struct elem { int val; struct elem *next;} Elem;#define BUFSIZE 10// 100以内void BucketSort(int *A, /*Elem **B, */int n){ Elem **B = (Elem **)malloc(n * sizeof(Ele原创 2014-06-06 16:04:23 · 462 阅读 · 0 评论 -
二叉查找树
#include #include typedef int ElementType;typedef struct treeItem { ElementType e; struct treeItem *left; struct treeItem *right;} TreeItem;typedef TreeItem *Tree;TreeItem *Find(Tree t, E原创 2014-06-06 16:17:44 · 359 阅读 · 0 评论 -
AVL平衡树
#include #include typedef int ElementType;typedef struct treeItem { ElementType e; struct treeItem *left; struct treeItem *right;} TreeItem;typedef TreeItem *Tree;#define MAX(a, b) ((a) >原创 2014-06-06 16:25:08 · 386 阅读 · 0 评论 -
Dijkstra迪科斯彻算法
主要参考《算法导论》与维基百科。戴克斯特拉算法(英语:Dijkstra's algorithm)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离,该算法可以用来找到两个原创 2014-08-12 15:07:23 · 1748 阅读 · 0 评论 -
不相交集合
不相交集合(disjoint-set)一些应用涉及将n个不同的元素分成一组不相交的集合,常需要确定某元素所属集合及合并两集合。(例如,确定无向图的连通分量)1、不相交集合数据结构不相交集合数据结构(disjoint-setdatastructure)维护着一组不相交的动态集合S={S1,S2,S3,...,Sk}。我们用一个代表(representative)来标识每...原创 2014-08-10 23:12:13 · 1040 阅读 · 0 评论 -
RSA算法原理(一)
RSA算法原理(一)作者: 阮一峰日期: 2013年6月27日如果你问我,哪一种算法最重要?我可能会回答"公钥加密算法"。因为它是计算机通信安全的基石,保证了加密数据不会被破解。你可以想象一下,信用卡交易被破解的后果。进入正题之前,我先简单介绍一下,什么是"公钥加密算法"。一、一点历史197转载 2015-10-12 23:37:29 · 366 阅读 · 0 评论 -
IntToString
#include #include #include #include void IntToStr(int iValue, char *strOutput){ int i = 0; int len = 0; int tmp = 0; int bNegative = 0; tmp = iValue; while (tmp % 10 != 0) { len++;原创 2014-09-04 23:03:13 · 558 阅读 · 0 评论 -
Stacks and queues
//============================================================// 使用数组实现的栈 20140613//============================================================#include #include typedef int StackElem;typedef s原创 2014-08-27 21:47:14 · 438 阅读 · 0 评论 -
字符串匹配
全部内容来自《算法导论》原创 2014-09-14 22:37:43 · 347 阅读 · 0 评论 -
GetWords
#include #include #include #include #include using namespace std;class StringEqual{public: StringEqual(const string &s): _str(s) {}; bool operator()(pair pr) { if (pr.first == _str) re原创 2014-08-31 22:47:14 · 493 阅读 · 0 评论 -
切割与松弛
参考《算法导论》原创 2014-08-17 16:00:35 · 530 阅读 · 0 评论 -
Kruskal算法
在Kruskal算法中,集合A是一个森林,其结点就是给定图的结点。每次加入到集合A中的安全边永远是权重最小的连接两个不同分量的边。在Prim算法中,集合A则是一棵树。每次加入到A中的安全边永远是连接A和A之外某个结点的边中权重最小的边。 Kruskal算法找到安全边的办法是,在所有连接森林中两棵不同的树的边里面,找到权重最小的边(u, v)。设C1和C2为边(u, v)所连接的两棵原创 2014-08-16 23:13:06 · 928 阅读 · 0 评论 -
Prim算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C原创 2014-08-14 22:12:21 · 447 阅读 · 0 评论 -
归并排序
#include #include #define INFINITY 0xffff// p <= q < rvoid Merge(int *A, int p, int q, int r){ int m = q - p + 1; // m >= 1 int n = r - q; // n >= 1 int *L = (int *)malloc((m + 1) * siz原创 2014-06-06 16:37:27 · 422 阅读 · 0 评论