数据结构与算法
文章平均质量分 79
微岩
这个作者很懒,什么都没留下…
展开
-
list反转
1. 问题描述已知1个List: 1->2->3->4->5;要求把List反转变为:5->4->3->2->1。2. 问题分析问题很简单,新创建一个list:(1)从List中取首元素l;(2)把这个元素l,按照前插法插入到list中(3)重复(1)(2),直到List中没有元素3. 算法实现List* ReverseList(List *list){原创 2013-06-08 17:16:23 · 2224 阅读 · 1 评论 -
线性表——1. 顺序表(向量)
1. 顺序表顺序表就是以数组存储数据,在加上一些管理数据的方法。2. 操作2.1 访问访问:A[i]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O(1)2.2 插入insert(i, item). .原创 2013-09-24 10:00:16 · 2777 阅读 · 1 评论 -
C函数的实现(strcpy,atoi,atof,itoa,reverse)
在笔试面试中经常会遇到让你实现C语言中的一些函数比如strcpy,atoi等1. atoi把字符串s转换成数字int Atoi( char *s ){ int num = 0, i = 0; int sign = 1; for( i=0; isspace(s[i]); i++ ); sign = (s[i] == '-')? -1:1; if( s[原创 2013-09-26 10:46:27 · 2531 阅读 · 0 评论 -
百度2014校园招聘研发工程师笔试题+答案
一,简答题(30分)1,当前计算机系统一般会采用层次结构存储数据,请介绍下典型计算机存储系统一般分为哪几个层次,为什么采用分层存储数据能有效提高程序的执行效率?10分(1)典型计算机存储系统一般分为:高速缓存(Cache),主存,辅存;三者速度递减,价格递减,容量递增。(2)原因:最基本的原理是程序的局部性,即某一指令(数据)一旦被执行(访问),那么不久之后很可能再次被执行(访问)原创 2013-10-08 17:46:45 · 4492 阅读 · 4 评论 -
排序算法理论与总结
1. 前言排序和查找是计算机科学中非常重要的一个课题,也是处理事务时常遇到的问题。可以说排序和查找是程序员必须掌握的基础知识。当前排序算法所要处理的问题特点:(1)数据量大(2)数据分布不集中2. 排序的基本思想一个优秀的排序算法必须遵循的思想:分而治之(Divide-Conquer-Merge)3. 算法分类分类基础排序O(n^2)原创 2013-07-11 16:00:21 · 1742 阅读 · 0 评论 -
快速排序算法原理与实现
摘要:本文描述了快速排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述输入:n个数的序列<a1,a2,a3,...,an>。输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。2.问题分析快速排序:最基本的思想就是通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。排序过程:(对原创 2013-07-13 21:48:08 · 3637 阅读 · 2 评论 -
希尔排序算法原理与实现
本文描述了希尔排序的算法原理,并且分析了算法的性能与选取的步长直接相关。最后给出了算法的C++实现程序。原创 2013-07-12 18:15:16 · 4838 阅读 · 0 评论 -
图(Graph)——基本概念、存储、遍历
1. 图的基本概念图(Graph):G = ( V,E )V(G):顶点E(G):边(1)边:(2)权:与图的边或弧相关的个数(3)子图:如果图G(V,E)和图G‘(V’,E‘),满足:V’属于V && E’属于E(4)顶点的度: 无向图:与顶点相连的边数 有向图: 入度:以该顶点为头的弧的数目 出度:以原创 2013-09-21 09:36:59 · 4297 阅读 · 0 评论 -
堆排序算法原理与实现
1. 堆(1)形状:完全二叉树。节点i : Parent = i/2 ; Left = 2i; Right = 2i + 1(2)根最大(最小)——大根堆(小根堆),左右子树没有大小关系2. 算法的思想(1)由于跟最大(最小),所以每次输出根(2)在对堆进行调整,(3)重复(1)(2)知道结束所以算法的重点就是如何建立堆和怎样高效的调整3原创 2013-10-14 16:04:16 · 1872 阅读 · 0 评论 -
选择排序算法原理与实现
摘要:本文描述了选择排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述输入:n个数的序列<a1,a2,a3,...,an>。输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。2. 问题分析选择排序:它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排原创 2013-07-11 21:24:15 · 2409 阅读 · 0 评论 -
冒泡排序算法原理与实现
摘要:本文描述了冒泡排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述把数据列Data = {x1, x2, x3, ....,xn},按照非递减顺序排列。2. 问题分析冒泡排序:这一种最为简单的排序算法,每一次从数列中选取最大(最小)的数,然后把它放在最后(前面),重复执行此操作,直至所有数据有序。3. 算法实现template void BubbleSort( CVector &vec ){ size_原创 2013-07-11 21:04:24 · 6053 阅读 · 1 评论 -
插入排序算法原理与实现
摘要:本文描述了插入排序的算法原理,给出了算法的逐步排序过程以及算法的实现。最后对算法的性能进行了分析。1. 问题描述输入:n个数的序列<a1,a2,a3,...,an>。输出:原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*。2.问题分析(1)从有序数列和无序数列{a2,a3,…,an}开始进行排序;(2)处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无原创 2013-07-12 14:00:03 · 2331 阅读 · 0 评论 -
图(Graph)——最小生成树、最短路径、Kruskal、Dijkstra、Floyd
4. 最小生成树4.1 生成树(1)定义:所有顶点均由边连接在一起,但不存在回路的图叫该图的生成树(2)深度优先生成树与广度优先生成树(3) 一个图可以有许多棵不同的生成树 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同 生成树是图的极小连通子图4.2 最小生成树生成树的每条边上的原创 2013-09-21 19:50:33 · 17642 阅读 · 0 评论 -
R树——空间索引
R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置转载 2013-10-18 21:41:21 · 2468 阅读 · 0 评论 -
树——(1)综述:二叉树,线索二叉树,二叉搜索树,B-/B+树,AVL树,红黑树
tree1. 定义树是n(n>=0)个结点的有限集。在任意一棵非空树中: (1)有且仅有一个特定的称为根的结点; (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,...Tm,其中每一个集合本身又是一棵树,并且称为根的子树.2. 树的基本概念:度:结点拥有的子树数称为结点的度。叶子(终端结点):度为0的结点称为叶子或终端结点。分原创 2013-06-27 17:56:31 · 3739 阅读 · 4 评论 -
荷兰旗问题(三色旗排序)
摘要:荷兰旗问题是三色排序,即某一组数据,元素的值只能为a,b ,c。把这组数据按照a, b, c的顺序排序。本文介绍了一种时间复杂度为O(n),空间复杂度O(1)的算法。1. 问题描述某盒子中有n个球,每个球的颜色可以是红、蓝、白,现在要求把球按照红、蓝、白的顺序摆放。这个问题叫做荷兰旗问题(荷兰旗由红、蓝、白三色组成)。对问题的抽象:一数列Data中原创 2013-12-28 20:31:49 · 5562 阅读 · 0 评论 -
跳表(Skip List)的介绍以及查找插入删除等操作
什么是跳表?要说清楚这个问题,我们就要先从普通的有序链表说起。一个普通有序列表的结构如下:我们可以看到,上图所示的链表按照由小到大的顺序排列(-1表示最小值,1表示最大值,这是本文的一个约定),如果我们想要查找一个元素x,算法如下:123cell *p = head;while (p->next->key x) p=p->next;retu转载 2013-09-25 14:43:40 · 3125 阅读 · 0 评论 -
树——(4)线索二叉树
1. 定义1.1 起源对于n个节点的二叉树,会有多少个空指针域呢? Key: n+1个对于n+1个NULL指针能不能够很好的利用起来呢??1.2 线索二叉树利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这样的二叉树叫线索二叉树。如果前驱和后继分别对应先序遍历,那么这叫先序线索树,同样有中序线索树,后原创 2013-07-04 15:52:36 · 1715 阅读 · 0 评论 -
前K项最小值
1. 问题描述从一些数据中找到前K个最小值。Data = {a1, a2, a3, a4........, an}Min = {ai1, ai2, ..... aik}2. 问题分析求前K项最小值有几种方法如下:(1)对数据排序,然后找到前K个最小值——效率太低(2)采用快排的Partition方法,Partition就是选择一个数据,然后用这个值把数组分原创 2013-06-10 13:18:42 · 1395 阅读 · 0 评论 -
归并2个数组中的元素
1. 问题描述已知2个List:LA,LB中的数据按照非递减排列;要求把LA,LB中的合并成为一个List,其中数据也按照飞递减排列(包含重复数据)。2. 问题分析 / a if a C = \ b if a > b 3. 算法#define DataType intint MergeList( DataType原创 2013-06-06 13:59:09 · 1202 阅读 · 0 评论 -
教你如何迅速秒杀掉:99%的海量数据处理面试题
前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。 毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问题。最后转载 2013-07-09 16:43:55 · 1093 阅读 · 0 评论 -
蚁群启发人类工程算法设计:结构精妙效率高
北京时间7月11日消息,据美国《连线》杂志网站报道,你是否曾经注意过蚂蚁是如何外出觅食的?这样的问题对于一般人而言似乎显得有些莫名其妙,但是对于生态学家和动物行为学家而言这一点却非常关键和有趣。尤其是在明确知道蚂蚁们实际上并没有统一的中央指挥调度系统的前提之下便更是如此。对蚁群行为的研究正为人类社会的工程学研究提供启发 通过简单的信息交换,蚁群成功应对不断变化的外部世界的挑战。它转载 2013-07-11 18:05:17 · 1684 阅读 · 0 评论 -
算法分析O(n), O(nlogn)...
1. 定义大O符号(Big O notation)是用于描述函数渐近行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。2. 说明f(n) = 2n^2 + 3n + 1f(n) = O(n^2)orf(n) ∈ O(n^2)为什么可以这么去描述?lim( f(n) / n^2) = a ( n--> 0,原创 2013-07-11 16:09:09 · 8658 阅读 · 0 评论 -
利用多核多线程进行程序优化
1.样例程序程序功能:求从1一直到 APPLE_MAX_VALUE (100000000) 相加累计的和,并赋值给 apple 的 a 和 b ;求 orange 数据结构中的 a[i]+b[i ] 的和,循环 ORANGE_MAX_VALUE (1000000) 次。说明: (1)由于样例程序是从实际应用中抽象出来的模型,所以本文不会进行 test.a=test.b= te转载 2013-07-01 15:29:44 · 1387 阅读 · 0 评论 -
快速排序的时间复杂度nlogn是如何推导的??
本文以快速排序为例,推导了快排的时间复杂度nlogn是如何得来的,其它算法与其类似。对数据Data = { x1, x2... xn }:T(n)是QuickSort(n)消耗的时间;P(n)是Partition(n)消耗的时间;(注:Partition专指把n个数据分为大小2份的时间)原创 2013-07-16 14:31:26 · 15074 阅读 · 0 评论 -
常用正则表达式汇总
1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2. "^\d+$" //非负整数(正整数 + 0) 3. "^[0-9]*[1-9][0-9]*$" //正整数 4. "^((-\d+)|(0+))$" //非正整数(负整数 + 0) 5. "^-[0-9]*[1-9][0-9]*$" //负整数 6.转载 2013-08-26 17:32:49 · 1386 阅读 · 0 评论 -
计算机科学中最重要的32个算法
奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。A* 搜索算法——图形搜索算法,从给定起点到给定终点计算出转载 2013-06-23 09:31:06 · 1356 阅读 · 0 评论 -
正则表达式笔记
摘要:本文对正则表达式简要介绍,并且提供大量实例。看完此文,你会对正则表达式有一个基本的理解。1. "."表示任意字符(匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。)2. 次数3. 选择4. 边界5. \ ——转义符6. 特殊字符7. 实例*匹配前面的子表达式零次或多次。+匹配前面的子表达式一次或多次。?匹配前面的子表达式零次或一次。{n}n是一个非负整数。匹配确定的n次。{n,}n是一个非负整数。原创 2013-08-26 17:41:56 · 1090 阅读 · 0 评论 -
平衡树(AVL)详解
1. 为什么平衡树?在二叉搜索树(BST,Binary Search Tree)中提到,BST树可能会退化成一个链表(整棵树中只有左子树,或者只有右子树),这将大大影响二叉树的性能。前苏联科学家G.M. Adelson-Velskii 和 E.M. Landis给出了答案。他们在1962年发表的一篇名为《An algorithm for the organization of inform原创 2013-10-07 19:30:04 · 2805 阅读 · 1 评论 -
树——(5)二叉搜索树
1. 定义你可以理解为折半查找以二叉树形式的表象。2. 操作2.1 查找2.2 插入2.3 删除3. 结构3.1 Tree Nodelchilddatarchildparent3.2 实现原创 2013-07-04 17:44:28 · 1939 阅读 · 0 评论 -
树——(2)树的存储:数组,链表
摘要:本文以二叉树树为例,描述树的两种存储方式——数组和链表,最后给出了二叉树的链式结构结点的详细实现。1. 数组1.1 普通树二叉树中各个节点的关系:结点编号123456789101112131415结点值12345000067原创 2013-07-04 10:43:13 · 2001 阅读 · 0 评论 -
仿C++ STL vector
通过对C++STL vector的分析,自己写了一个简单的Vector,作为学习用。1. Vector的特点:vector也就是顺序列表,是用类表示一维数组。(1)随机存取(2)在中间插入,删除操作比较麻烦,因为需要移动后面的数据。2. Vector ADT(1)属性size: Vector 中有元素个数capacity:Vector中可原创 2013-06-15 10:25:20 · 1820 阅读 · 0 评论 -
线性表——2. 链表
1. 定义链表就是每一个节点包含2部分:数据域+指针域(指向其它节点)链表根据其指针域的不同可以分为多个种类。本文只涉及单链表的操作,双向链表的操作与其类似。跳表的具体内容以后再说吧。1.1 单链表typedef int datatype typedef struct Lnode { datatype data;原创 2013-09-25 10:40:16 · 1935 阅读 · 1 评论 -
SynchronousQueue学习笔记
1. SynchronousQueue简介SynchronousQueue是无界的,是一种无缓冲的阻塞队列,插入操作必须等待令一个线程取数据,反之亦然(SynchronousQueue是线程安全的,是阻塞的)。同步队列没有任何内部容量,甚至连一个队列的容量都没有。PS:什么是线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果。声明一个SynchronousQueue有两种不同的方式原创 2016-10-21 18:51:30 · 972 阅读 · 0 评论