算法与数据结构
Weirenren_027
这个作者很懒,什么都没留下…
展开
-
分治法之二分法搜索最大值最小值
问题:给定一个数组,从中找出最大值和最小值利用分治法中的二分法解决:二分:将数组等分成两组(也有可能两数组数的个数相差一个),分别求出两数组的最值,将分开的数组再次等分,用递归按此等分下去,等分最终结果,最终两子数组的数的个数分别是1个或者2个。子数组中数的个数为1:该数设为最大值最小值子数组中数的个数为2:比较两数的大小,较大的数复给最大值,较小复给最小值回溯:子数组中最值返原创 2012-10-25 12:41:28 · 8748 阅读 · 0 评论 -
极大极小值算法
极小极大的定义 Minimax算法 又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法(即最小化对手的最大得益)。通常以递归形式来实现。Minimax算法常用于棋类等由两方较量的游戏和程序。该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的一个,其输赢的总和为0(有点像能量守恒,就像本身两个玩家都有1点,最后输家要将他的1转载 2013-08-24 18:32:30 · 35990 阅读 · 0 评论 -
海量数据处理方法
第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。此题,在我之前的一篇文章:十一、从头到尾彻底解析Hash表算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是转载 2013-01-07 12:01:23 · 684 阅读 · 0 评论 -
哈希函数
Hash查找因为其O(1)的查找性能而著称,被对查找性能要求高的应用所广泛采用。它的基本思想是:(1) 创建一个定长的线性Hash表,一般可以初始化时指定length;(2) 设计Hash函数,将关键字key散射到Hash表中。其中hash函数设计是最为关键的,均匀分布、冲突概率小全在它;(3) 通常采用拉链方法来解决hash冲突问题,即散射到同一个hash表项的关键字,以链表形式来表转载 2013-01-02 21:39:00 · 1684 阅读 · 0 评论 -
数据结构与算法之归并排序
归并排序思想:先分后合,每次合并的子数组序列是有序的时间复杂度:O(nlog2n),空间代价为O(n)代码如下:int a[10]={1,23,4,5,7,9,0,5,3,26},b[10]={0};void merge(const int left,const int mid,const int right){ int s1=left; int s2=mid; int s3原创 2012-12-15 01:26:40 · 724 阅读 · 0 评论 -
数据结构与算法之最小堆的建立
算法思路:二叉堆各节点用数组标示是线性的,父节点与其左孩子的索引关系:leftchild=2*parient+1;当高层数值较大的节点往下移动时,移动后还要判断该节点数值与左右孩子节点的大小关系,因而代码中需要再嵌套一个循环保证之后大小关系。#includeusing namespace std;//最小堆排序int heap[]={53,17,78,9,45,65,87,原创 2012-11-21 21:19:47 · 4228 阅读 · 0 评论 -
算法与数据结构之堆排序
一,线性的数组可以看成一个二差堆,堆中父节点与左孩子的关键码关系为:left=parent*2+1;堆排序思想:每次循环从二叉堆中将最大的元素shiftup上移至根节点,再将根节点与最后对末尾的元素交换。撇开末尾元素,如此再继续找出下一个最大元素,将此最大元素与此末尾元素交换。依此重复查找最大元素,然后交换。1.堆排序与插入排序思想有点类似。2.时间复杂度为nlog2(n);int原创 2012-12-14 23:17:25 · 747 阅读 · 0 评论 -
二叉搜索树
一,二叉搜索树简单理解:二叉搜索树是基于二分法搜索实现快速搜索的树形数据结构特性:左子树的节点小于父节点和且小于右子树,父节点小于右子树 二,AVL树1. AVL树也是一种二叉搜索树。2. 为了进一步提高二叉搜索树的搜索效率,即减少树的平均搜索长度,故而需要尽量降低数的高度。3. AVL树要求任何节点左右子树高度的差值不超过1. 重点 :AVL树的插入.删除操原创 2012-12-12 23:39:39 · 708 阅读 · 0 评论 -
散列(Hash table)也称哈希表
一,与集合和字典的区别:集合和字典(线性表,二叉搜索树,AVL树,B树)中元素与关键码没有直接的对应的关系,而哈希表中元素与关键码有对应的关系,而这层关系通过哈希函数桥接,通过关键码映射到表中某个地址位置来搜索元素的方法速率更高,比较次数很少。二,散列1.散列的性质:.散列函数是一个压缩映像函数,关键码集合比散列表地址集合大得多。不同关键码的映射后必定会出现在同一个散列地址上,原创 2012-12-11 21:29:03 · 1212 阅读 · 0 评论 -
并查集与kruskal最小生成树
1、 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。a.一个集合是一棵树,b.根节点下标代表集合名称,根节点的父为为负数,绝对值表示集合中的元素个数。并查集的重要知识点:a.加权规则,即并两个没有交集的集合,元素个数少的集合加到元素个数多的集合里原创 2012-12-05 21:46:53 · 863 阅读 · 0 评论 -
数据结构与算法之插入排序
#include#includeusing namespace std;//直接插入排序int arr[10]={2,3,5,7,9,0,1,4,5,6};int list [10];void insertSort(int ar[],int size){ for(int i=0;i<size;i++){ list[i]=ar[i]; for(int j=i-1;j>=0;j-原创 2012-11-21 21:21:44 · 689 阅读 · 0 评论 -
数据结构与算法之二分法插入排序
一.算法思想:插入排序算法思想:将插入的数与有序的数组各数比较,按照大小关系插入,保持原有大小顺序。(按照数组尾到数组头的顺序遍历)而二分法插入:首先取出原有序中间数与新插的数比较,然后插入新数大小包含于其中的一半数组,再次取该数组中间数,如此重复下去,直至最后得到数组个数为一,将最后得到的数之后的数后移,然后将新插入的数放在该索引处。二.模拟源码:#includeusi原创 2012-11-21 21:02:11 · 3058 阅读 · 0 评论 -
数据结构与算法之二叉树遍历
1.创建二叉树节点建立顺序:首先添加根节点,然后添加左孩子,再添加左孩子的左孩子(递归原因导致以左或右为先,该案例先添加左孩子),以此类推,当不再添加左孩子时,然后添加右孩子.当右孩子不添加时,然后函数回调到父节点是否添加右孩子,以此类推,建立二叉树。#include#includeusing namespace std;struct Node{ int value; Node原创 2012-11-21 21:12:35 · 844 阅读 · 0 评论 -
数据结构与算法之快速排序
一.快速排序思想:1.以数组中第一个数作为被比较数,并命名为基数(该数暂时为基数,因后面的比较,基数会变化),然后从该基数起开始往后顺序遍历数组,(注意遍历该数组时,所有数都与该第一个数相比较)2.遍历时,取出该数与被比较数(即第一个数,此时也是基数)相比较,如果该数比被比较数小(该案例用快排使之按从小到大顺序排列),则将该数与基数紧挨着的后面的数交换,交换后再将该数设为基数(实质是将基数往后挪了原创 2012-11-21 20:45:11 · 832 阅读 · 0 评论 -
递归之RGB难题
问题描述:n个方格,用三种不同颜色涂色每个格子,每个格子图一色,要求相邻以及首尾颜色也不同,求所有图色方法总数。思路:F(n)种方法符合要求,递归思想:1. 前面n-1个格子涂色符合要求,即有F(n-1)种方法,则第n个格图法只有一种。2.前面n-1个格子涂色不合格,仅当图第n个格合格,这表明前n-1个格的第n-1格与第1个格颜色相同,则第n个格图法有两种。因而F(n)原创 2012-11-04 21:18:40 · 1086 阅读 · 0 评论 -
递归之全排列
#includevoid perm(int *array,int a,int b);void swap(int *a,int *b);int main(){int array[4]={1,3,5,6};perm(array,0,3);int i; for(i=0;i<=3;i++){ printf("%d ",array[i]);原创 2012-10-25 13:15:47 · 792 阅读 · 0 评论 -
递归之n封信错排
问题:之前有装有信的n个信封,现在将信封中信取出放在非原信封内,问信封错排的种类数。递归思路:总共F(n)种排法,1.前面F(n-1)个信件错排符合要求,现将第n封原封未动的信取出与前面n-1中任意一个交换信,仍符合要求,即有(n-1)F(n-1)种方法2.前面F(n-1)个信件有一个原封未动,即前面n-2个信件错排符合要求,此时将第n封信件与前n-1中的唯一的原封未动的信错排,既原创 2012-11-04 21:32:43 · 1393 阅读 · 0 评论 -
最小生成树:kruskal算法与prim算法
Kruskal算法算法定义 克鲁斯卡尔算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将原创 2012-12-05 13:49:44 · 1049 阅读 · 0 评论