
数据结构与算法
戎·码一生
自信来自实力,改变来自挑战。做一只生活小强。
展开
-
统计一个文件的字符数据
统计一个文件中单词的个数,行数,以及字符的个数,空格的数量;忽略换行,文件中只有英文字母及空格和标点;不考虑一个单词在两行的情况;例如:文件名:filename.txthello world,i love you! byby!输出:1---5---23---42---1---15---10行:2---单词:6---字符:38---空格:14原创 2016-04-06 17:20:41 · 1037 阅读 · 0 评论 -
简单选择排序
选择排序的基本思想是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序中主要使用直接选择排序和堆排序。直接选择排序的过程是:首先在所有记录中选出序码最小的记录,把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。简单选择排序处理流程:(1) 从待排序序列中,找到关键字最小的元素;(2) 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;(3)原创 2014-09-10 20:44:20 · 922 阅读 · 0 评论 -
哈希表的【构造方法】【冲突处理方法】及【哈希拉链法的简单代码实现】
由于哈希表的查找高效性,在平时的算法中用的也是比较多。例如:字符串、单词个数的统计,只出现一次字符或者数字的统计,两个集合相同元素的查找等等,还有插入删除的高效(链地址法)都可以用哈希表来解决。所以这里对其做一个小小的总结。缺点可能是需要占用额外的内存空间。一、哈希函数的构造方法下面介绍五种常用的哈希构造方法:构造哈希函数的原则是:(1)函数本身便于计算;(2)计算出来的地址分布均匀,即对任一关键字k,f(k) 对应不同地址的概率相等,目的是尽可能减少冲突。1、除留余数法; 取关键字被某个不大于原创 2014-09-08 11:04:10 · 5582 阅读 · 0 评论 -
数据结构-【链表】单向链表的逆置和双向循环链表
单向链表的逆置1、为什么不能用auto变量的地址去初始化static型指针?因为Static是在编译时进行初始化的,而Auto是在运行时初始化的,在编译时,Auto变量还不存在呢,当然也就没有地址,初始化就不能成功了.#include <iostream>using namespace std;typedef struct student{ int number; struct student *pNext;} Stu;原创 2014-09-10 20:26:47 · 3306 阅读 · 0 评论 -
选择排序-【堆排序】
堆排序是一种基于选择排序的先进排序方法。原创 2014-10-05 22:09:30 · 658 阅读 · 0 评论 -
插入排序-【Shell排序】
//Shell排序是对插入排序的一种改进,在最坏的情况下时间复杂度为O(n2),在最好的情况下为O(n);当插入的数据基本有序的时候插入的效率时最高的;//Shell的基本思想是先将整个要排序的序列分成若干个子序列,分别对各个子序列进行直接插入排序,当各个子序列基本有序时,再对子序列进行一次插入排序;#include #include #include void shellinsert(原创 2014-10-05 21:50:57 · 814 阅读 · 0 评论 -
选择排序-【冒泡排序】
//冒泡排序其实并没有多大的特殊的价值,效率很低,其基本思想是第一个元素和第二个元素比较,如果第一个元素大,那么两个元素交换,然后第二个与第三个元素比较,较大的元素依次向后移动,最后找出最大的,依次找出第二大的,最后找出最小的;也可以反过来求解,先求最小的,从小到大的顺序;时间复杂度为O(n2);#include #include void bubble(int arrays[],int原创 2014-10-05 21:57:34 · 584 阅读 · 0 评论 -
插入排序-【插入排序】
//直接插入排序是一种简单的排序方法,其基本思想是将第一个元素看成是有序的子序列,再依次从第二个记录起逐个的插入这个有序的子序列中;//时间复杂度为0(n2);#include #include void insertsort(int arrays[],int number);int main(){ int count=0; int i;原创 2014-10-05 21:44:08 · 2141 阅读 · 2 评论 -
二叉树的【深/高度】【度为0/1/2的结点数】【遍历】【查找】【销毁】
与二叉树相关问题的求解:包括前中后,层次遍历,树的高度和深度,叶子结点的个数,度为1、2的结点个数,二叉树中数据的查找等相关问题的实现。相关代码的具体实现:原创 2014-10-07 21:05:48 · 1557 阅读 · 0 评论 -
二叉树的创建方法【递归】【循环】【插入】
二叉树是一种比较常用的数据结构,这里介绍三种创建二叉树的方法:第一:递归创建无序二叉树。include <stdio.h>#include <stdlib.h>#define len sizeof(struct bintree)struct bintree //二叉树的节点结构体,只存储一个int的数据;{ int data; struct bintree *lchild; struct bintree *rchild;};struct bintree* create() /原创 2014-10-07 21:02:11 · 3668 阅读 · 1 评论 -
大数据的处理方法<二>
海量数据面试题整理2013年11月02日 ⁄ 综合 ⁄ 共 15586字 ⁄ 字号 小 中 大 ⁄ 评论关闭1、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。s转载 2016-05-09 22:24:48 · 1952 阅读 · 0 评论 -
大数据的处理方法<一>
处理海量数据问题,无非就是:分而治之/hash映射 + hash统计 + 堆/快速/归并排序转载 2016-05-03 14:19:41 · 1279 阅读 · 0 评论 -
字符串【KMP算法】
说到KMP算法就不得不说一说BF(Brute Force)算法,因为好的事情的发展和进步往往都是因为原始事物状态的低效与不足。就像世界大战时期有些大咖说过,战争是推动社会进步的主要动力!虽然文字用的比较尖锐,听起来也比较残酷,但是细想还是有一定道理,当生活被压迫的不能继续,当明天成为了一种黑暗,当自由变成一种奢望,当腐败变成一种习以为常、、、这个时候就需要改变,需要进步,也就需要战争来维护人类生活原创 2016-04-06 11:14:35 · 651 阅读 · 0 评论 -
数据结构-【队列】链式队列和循环队列
队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。原创 2014-09-10 20:32:52 · 948 阅读 · 0 评论 -
数据结构-【栈】的链式存储和顺序存储
栈的最主要的特性:后进先出(Last in First Out),简称LIFO线性表。由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。其结构如下所示:原创 2014-09-10 20:31:54 · 1700 阅读 · 0 评论 -
归并排序
//归并排序时一种简单易懂的高级排序方法,这里的归并是指将两个有序的子序列合并为一个新的有序的序列。最后的结果的将一个n元素序列分为序列长度为1的子序列,然后两两归并。又称2——路归并。如果每次将三个有序的序列归并叫3--路归并。时间复杂度为nLOGn。直起归基时稳定的排序方法;简快堆希是不稳定的算法;#include #include void simplemerging(int ar原创 2014-10-05 22:15:57 · 565 阅读 · 0 评论 -
快速排序
//快速排序的平均时间性能最快,有着广泛的应用,典型时UNIX系统库函数的qsort函数,但在数据基本有序的情况下,其时间性能最差;//快速排序的基本思想是:任选序列中的一个元素,一般选第一个元素作为枢轴,用它和剩余的元素进行比较,将所有比他小的放在他的前面,比他大的元素放在后面,经过一趟排序后,以次元素为界,继续划分;一般从右开始比较,一直重复次过程,直至一部分中只剩下一个元素为止。但当元素有原创 2014-10-05 22:06:02 · 549 阅读 · 0 评论 -
程序时间复杂度的计算小结
一下是一些程序设计中的概念问题的小结://抽象数据类型:【abstract data type】ADT是一个数据模型和在该模型上定义的操作的集合的总称;【如:整型,实型,数组】//数据:data是对客观事物的符号的表示,在计算机科学中是指能输入到计算机中并被计算机程序处理的的符号的总称;//数据元素:data element 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,原创 2013-10-31 12:53:47 · 4375 阅读 · 0 评论 -
二分查找与判定树
二分查找是一种效率比较高的查找算法,但是它依赖于数组有序的存储,二分查找的过程可以用二叉树来形容描述:把当前查找区间的中间位置上的结点作为根,左子表和右子表中的结点分别作为根节点的左子树和右子树。由此得到的二叉树,称为描述二分查找树的判定树(Decision Tree)或比较树(Comprision Tree)。时间复杂度为O(logN)。原创 2016-05-10 15:07:04 · 20346 阅读 · 0 评论 -
哈希表在Top-k问题中的应用--字符串
1、介绍 数组的特点是:寻址容易,插入和删除困难; 链表的特点是:寻址困难,插入和删除容易。 这个世界上有没有一种能够综合两者优点的,既寻址容易又插入和删除容易的数据结构?Yes,它就是Hash表。2、哈希散列方法 (1)除留取余法 (2)平方散列法 (3)Fibonacci散列法3、哈希表使转载 2016-05-10 11:32:24 · 1074 阅读 · 1 评论 -
面试算法题
1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16 转换成双向链表4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下: struct BSTree转载 2016-05-02 22:27:43 · 9168 阅读 · 0 评论 -
秒杀系统的设计
基本设计假设秒杀系统是对500个物品A进行秒杀。需要考虑这些事情: 1、用户必须输入验证码才能秒杀2、手快的用户更容易秒杀到物品3、只能有500个物品A被秒杀4、用户参与秒杀后,不一定能拿到物品当用户U参与秒杀后,需要在session中设置某一flag,以防止该用户进一步秒杀。也就是当用户的session中flag为0时,用户可以参与秒杀,当为1时候,表示不原创 2016-05-02 22:28:02 · 1044 阅读 · 0 评论 -
鸽巢原理
鸽巢原理是一种非常有意思的思想:可以让看似复杂的问题变的简单。其中一种简单的表述法为:若有n个笼子和kn+1只鸽子,所有的鸽子都被关在鸽笼里,那么至少有一个笼子有至少k+1只鸽子。(n,k>=0)原创 2016-05-01 22:11:46 · 8729 阅读 · 1 评论 -
哈弗曼树与哈弗曼树编码
哈弗曼(Huffman)树,也称最优树,是一类带全路径长度最短的树,在实际中有广泛的应用,也是二叉树的一个具体应用。在哈夫曼树的定义中,涉及到了路径、路径长度、权等概念,下面先给出概念的定义。一、概念与定义路径:从树的一个结点到另一个结点的分支构成这两个结点之间的路径,对于哈夫曼树特指从根节点到某节点的路径。路径长度:路径上的分支数目叫做路径长度。树的路径长度:从树根到每一结点原创 2016-06-02 17:10:52 · 7486 阅读 · 0 评论 -
红黑树详解
之前看了很多写红黑树的博客,但是感觉都讲的不太清楚!没说这样操作如何使他保持平衡的,于是疑惑重重,就看不下去了,一次不经意看到一个人说维基百科的红黑树讲的好,我就随便点了一下一看——这下疯了~,怎么讲的这么好!可以说是把一个复杂的问题,讲得简单化!这太幸福了! 于是我就慢慢学会了!强烈推荐维基的这个讲解,再也找不到比这还好的讲解了!不知道它上边其它的怎么样,反正这个很好!!既然学会了,走过来了,我转载 2016-06-03 19:54:12 · 1309 阅读 · 0 评论 -
若干个(大量)数字中找前K大/小的元素--数值型
方法一:根据快速排序划分的思想 :(1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 ;(2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个。 注意[a,b)区间不用划分 ;因为[a,b)区间一定小于(b,d]区间;(3) 返回上一个区间,并返回此区间的数字数目。 如果个数大于100,对(b,d]重复(1)操作,直到最右边的区间个数小于100个; 如果个数小于100,对上一区间的左边进行划分,分为原创 2016-05-10 17:01:04 · 3551 阅读 · 0 评论 -
直线插补算法
直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行比对,看该点在次点的上方或者是下方,从而决定下一步该怎么走。即机床数控系统依照一定方法确定刀具运动轨迹的过程。也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点的方法,也称为“数据点的密化”;数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机原创 2015-04-20 17:35:22 · 41605 阅读 · 35 评论