
数据结构与算法
文章平均质量分 61
love-xiao-forever
这个作者很懒,什么都没留下…
展开
-
寻找链表倒数第k个节点
思路:用两个指针,p1和p2,p1先走k-1步,p2指向头结点,然后二者一起走,当p1指向尾节点的时候,p2指向的就是倒数第k个节点。P1走k-1步之后,指向正数第k个节点,当走到尾节点的时候p1走了n-k步,此时p2走到了第n-k+1节点上,就是倒数第k个节点。代码如下:node *find(node*list,int k){ node *p1=list;原创 2013-05-20 16:12:26 · 1112 阅读 · 0 评论 -
判断单链表是否存在环,判断两个链表是否相交问题详解(转载)
关键字: 算法【摘要】有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如果找到环的入口点?扩展:判断两个单链表是否相交,如果相交,给出相交的第一个点。有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形原创 2013-06-20 16:35:14 · 1111 阅读 · 0 评论 -
二叉排序树详解
二叉排序树(Binary Sort Tree或Binary Search Tree) 的定义为:二叉排序树或者是空树,或者是满足下列性质的二叉树。(1) :若左子树不为空,则左子树上所有结点的值(关键字)都小于根结点的值;(2) :若右子树不为空,则右子树上所有结点的值(关键字)都大于根结点的值;(3) :左、右子树都分别是二叉排序树。 结论:若按中序遍历一棵二叉排序树原创 2013-06-21 10:38:47 · 2116 阅读 · 0 评论 -
二叉排序树源代码
#include"iostream"using namespace std;struct BiTNode { int data; struct BiTNode *lchild,*rchild;};typedef struct BiTNode BiTNode,*biTree;/******************************************函数名:biTre原创 2013-06-21 10:43:07 · 1215 阅读 · 0 评论 -
基本排序算法小结
一、插入排序1 排序思想 将待排序的记录Ri,插入到已排好序的记录表R1, R2 ,…., Ri-1中,得到一个新的、记录数增加1的有序表。 直到所有的记录都插入完为止。复杂度为O(n2) 。 设待排序的记录顺序存放在数组R[1…n]中,在排序的某一时刻,将记录序列分成两部分:◆ R[1…i-1]:已排好序的有序部分;◆ R[i…n]:未排好序的无序部分。原创 2013-06-21 16:36:54 · 2087 阅读 · 3 评论 -
内部排序方法性能
原创 2013-06-21 19:01:09 · 1050 阅读 · 0 评论 -
不要被阶乘吓到(beauty of programe)
问题一:给定一个整数N,求该整数的阶乘中末尾含有多少个0?例如:N=10;N!=3628800,N!的末尾含有两个0.问题二:求N!的二进制表示中最低位1的位置 阶乘:是所有小于和等于该数的正整数的乘积,自然数N的阶乘是N!,这一表示法是基斯顿 卡曼引入的。阶乘定义为:一种数学计算方式。用比给定数值(必定大于等于零)小的自然数依次相乘直到最终因数为给定数值为止。记作“N!”。例如 5原创 2013-07-15 20:43:17 · 1674 阅读 · 1 评论 -
最短路径算法详解《转载》
1 最短路径算法在日常生活中,我们如果需要常常往返A地区和B地区之间,我们最希望知道的可能是从A地区到B地区间的众多路径中,那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:(1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。(2)确定终点的最短路径问题:与确定起点原创 2013-06-30 10:58:37 · 1472 阅读 · 0 评论 -
Fibonacci查找
一、Fibonacci查找方法是根据Fibonacci数列的特点对查找表进行分割。 由算法知,Fibonacci查找在最坏情况下性能比折半查找差,Fibonacci查找的优点是分割时只需进行加、减运算。Fibonacci数列的定义是: F(0)=0,F(1)=1,F(j)=F(j-1)+F(j-2) 。 int fib(int n){原创 2013-07-01 10:26:09 · 2043 阅读 · 0 评论 -
堆排序解析
一、堆的定义 是n个元素的序列H={k1, k2 , … kn},满足ki≤k2i 当2i≤n时 ki≥k2i 当2i≤n时或者 ki≤k2i+1 当2i+1≤n时 ki ≥k2i+1 当2i+1≤n时 由堆的定义知,堆是一棵以k1为根的完全二叉树。若对该二叉树的结点进行编号(从上到下,从左到右),得到的原创 2013-07-02 09:19:48 · 1886 阅读 · 0 评论 -
外部排序分析
当对数据记录量巨大的数据文件进行排序时,由于受到内存容量的限制,无法将所有数据记录一次全部读入到内存进行。排序过程中需要多次进行内、外存之间的数据交换。利用外存对数据文件进行排序称为外部排序。 外部排序最基本的方法是归并。这种方法是由两个相对独立的阶段组成:① 按内存(缓冲区)的大小,将n个记录的数据文件分成若干个长度为l的段或子文件,依次读入内存并选择有效的内部排原创 2013-07-03 11:00:57 · 2036 阅读 · 0 评论 -
队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
下午把队列的各种操作用链表实现了一下,建立,插入元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空,源代码调试已经通过,运行结果如下图所示:#include "iostream"using namespace std;typedef struct student{ int data; struct student * next;}node;//定义结构体节点原创 2013-06-18 16:53:55 · 3499 阅读 · 2 评论 -
B树
用阶定义的B树B树又叫平衡多路查找树。一棵m阶的B树的特性如下:树中每个结点最多含有m个孩子(m >= 2)除根结点和叶子结点外,其它每个结点至少有ceil(m / 2)个孩子(ps:ceil(x)取x的上整数)若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根节点为叶子结点,整棵树只有一个根结点)所有叶子都出现在同一层每个非终端结点中包含有n个关键字信息:(转载 2013-06-18 13:56:52 · 1311 阅读 · 0 评论 -
链表栈的实现
#include "iostream"using namespace std;typedef struct student{ int data; struct student * next;}node;//定义结构体节点typedef struct linkqueue{ node * first; node * rear;}stack;//定义队列结构,首指针和尾指针原创 2013-06-18 21:35:49 · 1194 阅读 · 0 评论 -
求最大连续子序列和问题
问题描述: 输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -4 13 -5 -2,则最大子序列和为20。序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。算法一://穷举法,复杂度O(n^3) 最容易想到也是最简单的算法long maxSubSum1(cons原创 2013-05-22 10:31:33 · 1495 阅读 · 0 评论 -
从尾到头打印链表,不允许逆置原链表
方法1:用栈实现,从第一个节点开始逐步向后,然后把节点的指针(地址)依次推入栈中,当全部遍历结束后,从栈顶开始依次取出内容,并打印数据。由于后来的节点地址在栈的上方,所以打印顺序是从尾打印的。voidprint(Node *list){ stacknode; Node*p=list; while(p!=NULL) {原创 2013-05-20 17:33:25 · 1090 阅读 · 0 评论 -
判断回文数的两种方法(代码解析)
#include "iostream"using namespace std;//将整数翻转,之后比较,若跟原来的数相等,就是回文数字//若1234321,倒转之后数字为1234321,相等,就是回文数字void isHuiWen(int num){ int n=0,temp=num; while (temp!=0) { n=n*10+temp%10; temp/=10;原创 2013-05-24 10:45:55 · 7683 阅读 · 0 评论 -
10种排序
一、冒泡(Bubble)排序[csharp] view plaincopyvoid BubbleSortArray() { for(int i=1;i { for(int j=0;i { if(a[j]>a[j+1])//比较交换相邻转载 2013-05-29 14:58:32 · 915 阅读 · 0 评论 -
判断字符串中字符出现的频率
#include "stdio.h"#include "stdlib.h"int main(){ char a[50]; gets(a); printf("%s\n",a); char re[50]; int num[50]; int k=0,flag=0,j=0,i; re[0]=a[0]; num[0]=1; for (i=1;a[i]!=0;i++)原创 2013-05-29 18:43:03 · 1156 阅读 · 1 评论 -
查找子串位置
#include "iostream"using namespace std;int fun(char *p,char *q){ int num1=0,num2=0; char *p1=p; char *q1=q; while (*p1++!='\0') { num1++; } cout<<"num1:"<<num1<<endl; cout<<"p:"<原创 2013-05-30 14:10:52 · 986 阅读 · 0 评论 -
二叉树建立、遍历(前序,中序,后序),求叶节点个数,求节点个数
二叉树是笔试面试中考试最频繁的数据结构之一,主要包括,程序建立一个二叉树,三种次序遍历二叉树,返回叶子节点的数目,求二叉树节点的总数等。建立一个二叉树节点的数据结构typedef struct Node{int data;struct Node *left,*right;}Node;,结构体内包括数据,左子树,又子树;一、建立二叉树的程序代码如下Node *CreatB原创 2013-05-31 13:47:58 · 5644 阅读 · 0 评论 -
二叉树测试源码
#include "stdio.h"#include "stdlib.h"#define Maxsize 100;typedef struct Node{ int data; struct Node *left,*right;}Node;Node *CreatBTree();void preVisit(Node *T);void middVisit(Node *T)原创 2013-05-31 13:50:22 · 1040 阅读 · 0 评论 -
归并排序
目前我掌握的排序算法有冒泡排序、插入排序、堆排序、快速排序,这几个排序算法的过程和思想包括时间复杂度我都能快速的讲出个1234来,唯独对归并排序理解的不够深入,这里重新学习一下归并排序分治思想将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解建立原问题的解,归并排序完全遵循分治模式:分解:分解待排序的n个元素的序列成各具转载 2013-06-01 09:04:38 · 879 阅读 · 0 评论 -
树
树的周游深度优先(DFS) 先根次序若树非空,则遍历方法为:①访问根结点。②从左到右, 依次先根次序遍历根结点的每一棵子树。 访问次序:ABECFHGD注意:等同于转换的二叉树进行先序周游。后根次序若树非空,则遍历方法为:①从左到右, 依次后根遍历根结点的每一棵子树。②访问根结点。转载 2013-06-01 09:43:04 · 974 阅读 · 0 评论 -
HashMap
1.HashMap的数据结构 数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“链表的数组” ,如图: 从上图我们可以发现哈希表是由数组原创 2013-08-04 16:06:27 · 1432 阅读 · 1 评论