
数据结构与算法
yvhqbat
whuster
展开
-
并查集算法-动态连通性
介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。动态连通性的应用场景: 网络连接判断: 如果每个pair中的两个整数分别代表一个网络节点,那么该pair就是用来表示这两个节点是需要连通的。那么为所有的pairs建立了动态连通图后,就能够尽可能少的减少布线的需要,因为已经连通的两个节点会被直接忽略掉。并查集(Union-Find)算法介绍 htt转载 2016-07-13 10:49:36 · 550 阅读 · 0 评论 -
冒泡排序
void BubbleSort(int A[],int length){ if(A==NULL || length<=0){ return; } for(int i=0;i<length;i++){ for(int j=1;j<length-i;j++){ if(A[j-1]>A[j]){原创 2016-06-13 20:50:34 · 378 阅读 · 0 评论 -
筛素数法
#ifndef _PRIME_NUMBER_H_#define _PRIME_NUMBER_H_#include "string.h"#include <iostream>//筛素数法int PrimeNumber(int n){ if (n < 2){ return -1; } bool *flag = new bool[n]; memset(原创 2016-03-27 11:26:48 · 300 阅读 · 0 评论 -
位运算之二进制中1的个数
//面试题10,二进制中1的个数int NumberOf1(int n){ int count = 0; while (n){ count++; n = (n - 1)&n; //关键,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0, //那么一个整数的二进制表示中有多少了1,就可以进行多少次这样的操作。原创 2016-03-02 13:16:10 · 269 阅读 · 0 评论 -
斐波那契数列之递归、循环
//递归 recursiveint AddFrom1ToN_recursive(int n){ //if (n >= 1){ // return n + AddFrom1ToN_recursive(n - 1); //} //else{ // return 0; //} return n <= 0 ? 0 : n + AddFrom1ToN原创 2016-03-02 08:37:57 · 494 阅读 · 0 评论 -
不相交集ADT
按大小求并和按高度求并,保证所有的树的深度最多是O(logN) Find操作和表示x的节点的深度成正比。//不相交集ADTconst int NumSets = 8;//不相交集合的类型声明typedef int DisjointSet[NumSets+1];typedef int SetType;//初始化例程void InitializeDisjointSet(DisjointSet原创 2015-12-03 16:28:53 · 334 阅读 · 0 评论 -
分离链接散列表
分离链接散列表的实现 做法:将散列到同一个值的所有元素保留到一个表中。//分离链接散列表 separate chaining//template<typename T>struct ListNode;//template<typename T>typedef struct ListNode* Position;typedef struct ListNode* List;struct Li原创 2015-12-01 21:18:59 · 470 阅读 · 0 评论 -
开放地址散列表
开放地址散列表(open addressing hashing):是一种不使用链表解决冲突的方法。如果有冲突发生,那么就要尝试选择另外的单元,直到找出空的单元为止。1.线性探测法 2.平方探测法 3.双散列//开放地址散列表//类型声明enum KindOfEntry{ legitimate, empty, deleted};struct HashEntry{原创 2015-12-02 15:58:30 · 659 阅读 · 0 评论 -
归并排序
归并排序 运行时间O(NlogN) 需要将数据拷贝到临时数组再拷贝回来,严重放慢了排序的速度。 对于重要的内部排序应用而言,还是选择快速排序。 合并的例程是大多数外部排序算法的基石。//归并排序//驱动程序template<typename T>void MergeSort(T A[], int N){ T *tmp_array = new T[N]; //tmp_ar原创 2015-12-01 16:58:28 · 464 阅读 · 0 评论 -
堆排列
由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。二次操作时间相加还是O(N * logN)。故堆排序的时间复杂度为O(N * logN)。//堆排序:利用 最大堆 max_heap//从数组的0位置开始int LeftChild(int i){ return (2 * i + 1);原创 2015-11-30 21:02:07 · 329 阅读 · 0 评论 -
堆和优先队列
//如果使用vector代替array,可以动态改变大小,就不需要struct HeapStruct;template<typename ElementType>struct HeapStruct{ int Capacity; //数组所能存放元素的最大个数 int Size; //当前有限队列的大小 ElementType *Elements; //存放元素的数组原创 2015-11-30 19:49:46 · 367 阅读 · 0 评论 -
希尔排序
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。//希尔排序原创 2015-11-30 16:24:31 · 345 阅读 · 1 评论 -
快速排序
快速排序算法 O(N*logN)//插入排序 从小到大排序template<typename T>void InsertionSort(T *A, int N){ int j, p; T tmp; for (p = 1; p < N; p++){ tmp = A[p]; for (j = p; j>0 && A[j-1] > tmp;原创 2015-11-27 11:15:36 · 322 阅读 · 0 评论 -
插入排序
插入排序 对于小数组,插入排序比较好。 O(N2)//插入排序 从小到大排序template<typename T>void InsertionSort(T *A, int N){ int j, p; T tmp; for (p = 1; p < N; p++){ tmp = A[p]; for (j = p; j>0 && A[j-原创 2015-11-27 10:44:24 · 248 阅读 · 0 评论 -
二叉查找树
////////////二叉查找树////////////struct TreeNode;typedef struct TreeNode* SearchTree;typedef struct TreeNode* Position;struct TreeNode{ ElementType Element; TreeNode *left; TreeNode *right;原创 2015-11-23 21:19:13 · 346 阅读 · 0 评论 -
AVL树
AVL树是其每一个节点的左子树和右子树的高度差最多差1的二叉查找树。///////////Avl树//////////////struct AvlNode;typedef struct AvlNode* AvlTree;typedef struct AvlNode* Position;struct AvlNode{ ElementType element; AvlTree le原创 2015-11-24 20:17:48 · 328 阅读 · 0 评论 -
模式匹配算法总结
本文参考: 1. http://blog.youkuaiyun.com/tukangzheng/article/details/38438481 2. 《算法导论》 模式匹配:子串在主串中的定位设S为目标串(主串),P为模式串(子串),且不妨设:S="s0s1s2...sn-1"P="t0t1t2...tm-1"1. 暴力匹配算法串的匹配实际上是对合法位置0<=i<=n-m依次将目标串中的子串S[0转载 2016-06-19 20:32:34 · 3839 阅读 · 0 评论