随笔分类 -  算法/数据结构

【面试题】二维数组的查找
摘要:题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数字,则可以排除它所在的列。如果它小于要查找的数字,则可排除它所在的行。这样如果要查找的数字不在数组的右上角,则每次判断都可以排除一行或一列以缩小查找范围,直到找到要查找的数字,或者查找范围为空。下图是在二维数组中查找7的示意图:参考代码:// 二维数组matrix// 每 阅读全文

posted @ 2013-03-01 07:00 zhuyf87 阅读(6760) 评论(0) 推荐(2)

zlib压缩数据
摘要:zlib是用于数据压缩的函数库,使用DEFLATE算法。最初是为libpng函数库开发,后来普遍为许多软件所使用。zlib为自由软件。DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。zlib在业界应用广泛,包括:Linux kernel:使用zlib实作网络协定的压缩、档案系统的压缩以及开机时解压缩内核。libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。Apache:使用zlib实作http 1.1。OpenSSH、OpenSSL:以zlib达到最佳化加密网络传输。FFmpeg:以zlib 阅读全文

posted @ 2013-02-21 14:17 zhuyf87 阅读(8514) 评论(0) 推荐(0)

快速排序
摘要:快速排序算法被列为20世纪十大算法之一,由Tony Hoare设计。在c++的STL、Java SDK和.net framework中都有各自的实现版本,可见其应用非常广泛。基本思想通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。所以快速排序的基本步骤如下:1. 从数列中挑出一个元素,称为 "基准"(pivot)。2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间 阅读全文

posted @ 2013-01-30 11:29 zhuyf87 阅读(444) 评论(0) 推荐(0)

白话算法 快速排序
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/6684558快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因此本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。 阅读全文

posted @ 2013-01-30 10:09 zhuyf87 阅读(277) 评论(0) 推荐(0)

归并排序的代码实现(递归与非递归)
摘要:#include <iostream>using namespace std;//----------------------------------------------------------// 归并排序(递归实现)// 将有二个有序数列data[first...mid]和data[mid...last]合并void Merge(int data[], int first, int mid, int last, int temp[]){ int i = first, j = mid + 1; int m = mid, n = last; int k = 0; ... 阅读全文

posted @ 2013-01-16 09:34 zhuyf87 阅读(390) 评论(0) 推荐(0)

归并排序的实现
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/6678165归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void MemeryArray(int a[], int n, int b[], int m, int c[] 阅读全文

posted @ 2013-01-15 18:02 zhuyf87 阅读(254) 评论(0) 推荐(0)

排序算法的稳定性
摘要:假设(关键字key)ki = kj(1≤i≤n, 1≤j≤n, i≠j),且在排序前的序列中(记录record)ri领先于rj(即i<j)。如果排序后ri仍领先于rj,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中rj领先ri,则称所用的排序方法是不稳定的。如下图,经过对总分的降序排序后,总分高的排在前列。此时对于令狐冲和张无忌而言,未排序时是令狐冲在前,那么它们总分排序后,分数相等的令狐冲依然应该在前,这样才算是稳定的排序,如果他们二者颠倒了,则此排序是不稳定的了。只要有一组关键字实例发生类似情况,就可认为此排序方法是不稳定的。排序算法是否稳定的,要通过分析后才能得出。【学 阅读全文

posted @ 2013-01-15 17:46 zhuyf87 阅读(252) 评论(0) 推荐(0)

堆排序 c/c++实现
摘要:#include <iostream>using namespace std;void Swap(int & left_data, int & right_data){ int auxiliary = left_data; left_data = right_data; right_data = auxiliary;}//----------------------------------------------------------------------------------// 小顶堆// 从i开始,到其父节点,父节点的父节点...,依次检查、调整以符合“ 阅读全文

posted @ 2013-01-11 16:58 zhuyf87 阅读(4382) 评论(0) 推荐(0)

堆与堆排序
摘要:原文地址:http://blog.csdn.net/morewindows/article/details/6709644堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:由 阅读全文

posted @ 2013-01-11 15:46 zhuyf87 阅读(283) 评论(0) 推荐(0)

希尔排序
摘要:1. 算法思想希尔排序(Shell Sort),也称递减增量排序,是插入排序的一种高速而稳定的改进版本。希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布。希尔排序是基于插入排序的如下性质而进行改进的:插入排序在对几乎已经排好序的数据操作时,效率非常高,可以达到线性排序的效率。该方法的基本思想是:先将整个待排序列分成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此 阅读全文

posted @ 2012-12-31 10:05 zhuyf87 阅读(401) 评论(0) 推荐(0)

希尔排序代码实现
摘要:// 希尔排序1void ShellSort1(int data[], int count){ int step = 0; int auxiliary = 0; for (step = count / 2; step > 0; step /= 2) { for (int i = 0; i < step; ++i) { for (int j = i + step; j < count; j += step) { // 直接插入排序 if ... 阅读全文

posted @ 2012-12-31 10:01 zhuyf87 阅读(2120) 评论(0) 推荐(0)

直接插入排序
摘要:直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序序列中,从而得到一个新的、记录数增1的有序序列。工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序数据逐步后移,为最新元素提供插入空间。具体算法描述如下:1. 从第一个元素开始,该元素可以认为已经被排序2. 取出下一个元素,在已排序序列中从后向前扫描3. 如果该元素(已排序)大于新元素,将该元素后移4. 重复步骤3,直到找 阅读全文

posted @ 2012-12-28 15:14 zhuyf87 阅读(277) 评论(0) 推荐(0)

简单选择排序
摘要:简单选择排序(Simple Selection Sort)是通过n – i次关键字之间的比较,从n – i + 1个记录中选出关键字最小(大)的记录,并和第i(1≤i≤n)个记录交换。这种排序算法简单直观,首先从未排序序列中找到最小(大)元素,存放到排序序列的起始位置。然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。算法实现及测试:#i 阅读全文

posted @ 2012-12-27 17:41 zhuyf87 阅读(2353) 评论(0) 推荐(0)

冒泡排序
摘要:冒泡排序(Bubble Sort)是一种交换排序。基本思想是:每次(外循环)遍历序列都把最大(小)的元素放在最前面(通过内循环的“比较-交换”),然后再对剩下的序列重复这个过程,每次遍历之后待排序序列就少一个元素,直到排序完毕。因此,时间复杂度在最坏的情况下是O(N ^ 2)。算法实现及测试:#include <iostream>using namespace std;// 冒泡排序void BubbleSort(int data[], int count){ int auxiliary = 0; bool swap_flag = true; for (int i = 0; ... 阅读全文

posted @ 2012-12-26 18:11 zhuyf87 阅读(503) 评论(1) 推荐(1)

外排序
摘要:外排序(External sorting)是指能够处理极大量数据的排序算法。通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。然后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对 90 阅读全文

posted @ 2012-12-26 16:13 zhuyf87 阅读(300) 评论(0) 推荐(0)

散列表查找的性能分析
摘要:散列表的查找过程基本上和造表过程相同。一些关键字可通过散列函数转换的地址直接找到,另一些关键字在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平均查找长度来衡量。查找过程中,关键字的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素:1. 散列函数是否均匀;2. 处理冲突的方法;3. 散列表的装填因子。散列表的装填因子定义为:α = 填入表中的元素个 阅读全文

posted @ 2012-12-20 13:04 zhuyf87 阅读(845) 评论(0) 推荐(0)

散列表的简单实现(大话数据结构)
摘要:#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 100 /* 存储空间初始分配量 */#define SUCCESS 1#define UNSUCCESS 0#define HASHSIZE 12 /* 定义散列表长为数组的 阅读全文

posted @ 2012-12-20 12:42 zhuyf87 阅读(910) 评论(0) 推荐(1)

处理散列冲突的方法
摘要:1. 开放定址法开放定址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。Hi = (H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列。di可有下列三种取法:(1)di=1,2,3,…, m-1,称为线性探测再散列;(2)di=1^2, -(1^2), 2^2, -(2^2), 3^2, …, ±(k^2),(k<=m/2),称二为次探测再散列;(3)di=伪随机数序列,称为伪随机探测再散列。所谓伪随机数,用同样的随机种子,将得到相同的 阅读全文

posted @ 2012-12-19 16:22 zhuyf87 阅读(4535) 评论(0) 推荐(0)

散列函数的构造方法
摘要:好的散列函数要求:(1)计算简单,至少散列函数的计算时间不应该超过其他查找技术与关键字比较的时间;(2)计算出的散列地址分布均匀,这样可以保证存储空间的有效利用,并减少为处理冲突而耗费的时间。1. 直接定址法取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。2. 数字分析法假设某公司的员工登记表以员工的手机号作为关键字。手机号一共11位。前3位是接入号,对应不同运营商的子品牌;中间4位表示归属地;最后4位是用户号。不同手机号前7位相同的可能性很大,所以可以选择后4位作为散列地址,或者 阅读全文

posted @ 2012-12-17 15:28 zhuyf87 阅读(7861) 评论(0) 推荐(0)

散列表查找概述
摘要:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞(collision)。具有相同函数值的关键字对该散列函数来说称做同义词(s 阅读全文

posted @ 2012-12-16 14:48 zhuyf87 阅读(641) 评论(0) 推荐(0)

导航