数据结构与算法
文章平均质量分 70
aturbofly
小硕一枚,码农一个。酷爱编程。热爱互联网。目前主要从事自然语言处理,推荐方面的算法开发。
研究生期间的研究方向:推荐系统。
展开
-
分别使用递归和非递归实现二分查找算法
#includeint BinarySearch(int array[],int len,int findData){ if(array==NULL||len<=0) return -1; int start=0; int end=len-1; while(start<=end) { int mid=start+(end-start)/2;转载 2013-09-01 14:19:10 · 1763 阅读 · 0 评论 -
二叉树
1.二叉树的定义 二叉树是n个结点的有限集合,改集合或者为空集,或者由一个根节点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。2.二叉树的特点每个结点最多有两棵子树,所以不存在度大于2的结点。注意是最多有!左子树和右子树是有顺序的,次序不能任意颠倒。即使书中某结点只有一棵子树,也要区分它是左子树还是右子树3.特殊二叉树3.1.斜树顾名思义,斜树一定转载 2013-09-20 15:50:35 · 939 阅读 · 0 评论 -
线索二叉树简介
结点结构如下: 其中,ltag为0时指向该结点的左孩子,为1时指向该结点的前驱;rtag为0时指向该结点的有孩子,为1时指向该结点的后继。线索二叉树结构实现:typedef int TElemType;typedef enum{Link,Thread} PointerTag;typedef struct BiThr转载 2013-09-20 20:04:58 · 808 阅读 · 0 评论 -
模式匹配算法-KMP算法
朴素模式匹配算法的最大问题就是太低效了。于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写。简单的说,KMP算法的对于主串的当前位置不回溯。也就是说,如果主串某次比较时,当前下标为i,i之前的字符和子串对应的字符匹配,那么不要再像朴素算法那样将主串的下标回溯,比如主串为“abcababcabcabcabcabc”,子串为“abcabx”.第一次匹配的时候,主串1,2,3原创 2013-09-16 22:06:58 · 1148 阅读 · 0 评论 -
模式匹配算法--朴素算法
1.朴素的模式匹配算法。朴素模式匹配算法,简单的说就是循环把主串的每个字符作为开头,与子串去进行匹配。对主串做大循环,每个字符为开头做子串(要匹配的字符串)的小循环,如果对应字符匹配,则两字符串都向后移位,否则子串又从子串的开头开始与主串前一步比较的字符开头的下一位继续匹配,直到匹配成功或(主串)遍历完成。比如主串为“googldgfegogegoogleglgoogegooglegoo”原创 2013-09-16 10:19:18 · 3983 阅读 · 0 评论 -
交换单链表任意两个元素(完整程序)
#include#include#includetypedef struct node{ int data; struct node* next;}linklist;//typedef struct node linklist;linklist *L=NULL;linklist* createList(int *a,int len){ // int data; l原创 2013-09-03 16:50:34 · 2319 阅读 · 0 评论 -
将数组的后面m个数移动为前面m个数
#includevoid func(int *start,int *end){ while(start<end) { int temp=*start; *start=*end; *end=temp; ++start; --end; }}void f(int len,int n,int *a){ func(a,a+n-1); func(a+n,a+len-转载 2013-09-02 11:01:34 · 1539 阅读 · 0 评论 -
一次遍历找出单链表中的倒数第k个元素
由于单链表只能从头到尾依次访问链表的各个节点,所以如果要找链表的倒数第k个元素,也只能从头到尾遍历查找。在查找过程中,设置两个指针,让其中一个指针比另一个指针先移动k步,然后两个指针同时往前移动。循环到先行的指针值为NULL时,另一个指针所指的位置就是要找的位置。程序代码如下:Node* FindElem(LinkList *L,int k){ LinkList ptr1, ptr2;原创 2013-09-02 15:32:48 · 1995 阅读 · 0 评论 -
重新排列数组使得数组左边为奇数,右边为偶数
/* *用两个指针分别指向数组的头和尾,头指针正向遍历数组,找到第一个偶数,尾指针逆向遍历数组,找到第一个奇数,交换两个指针指向的数字,然后两指针沿着相应的方向 *继续向前移动,重复上述步骤,直到指针大于等于尾指针为止。*/#includevoid Swap(int &a,int &b){ int temp=a; a=b; b=temp;}void ReverseArray(in转载 2013-09-02 10:06:06 · 2279 阅读 · 0 评论 -
用递归算法判断一个数组是否递增
#include bool isIncrease(int a[],int n) { if(n==1) return true; return (a[n-1]>=a[n-2])&&isIncrease(a,n-1); } int main() { int array[]={1,2,3,3,4,5}; int len=sizeof(array)/sizeof(arra转载 2013-09-01 11:00:41 · 3109 阅读 · 0 评论 -
在排好序的数组中找出给定数字出现的次数
#includeint BinarySearch(int *a,int length,int num,bool isLeft){ int left=0,right=length-1; int last=0; while(left<=right) { int mid=(left+right)/2; if(a[mid]<num) { left=mid+1; }转载 2013-09-01 14:40:32 · 1515 阅读 · 0 评论 -
找出数组中重复次数最多的数
方法一:如果相同的数是连续出现从第一个数开始,与它后面的数比较,如果相同,计算+1,如果不等,计数置为1.同时保持此时的计数次数和此时的元素;#includeint Search(int a[],int len){ int max=0;//保持到目前为此出现次数最多的那个数 int count=1; int maxnum=count;//保存最大计数次 int maxd;原创 2013-09-01 17:19:52 · 10445 阅读 · 2 评论 -
哈夫曼树及一种java实现
最优二叉树,也称哈夫曼(Haffman)树,是指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。那么什么是二叉树的带权路径长度呢?在前面我们介绍过路径和结点的路径长度的概念,而二叉树的路径长度则是指由根结点到所有叶结点的路径长度之和。如果二叉树中的叶结点都具有一定的权值,则可将这一概念加以推广。设二叉树具有n 个带权值的叶结点,那么从根结点到各个叶结点的路径长转载 2016-03-23 20:54:12 · 1739 阅读 · 0 评论