数据结构和算法
文章平均质量分 73
feike2008
这个作者很懒,什么都没留下…
展开
-
二叉堆类添加和删除元素
现在有这么一个需求,需要求一组数据的里最低的值.可以用二叉堆来快速的实现这个功能. 二叉堆 在有序列表中,每个元素都按照由低到高或由高到低的顺序保存在恰当的位置。这很有用,但是还 不够。事实上,我们并不关心数字 127 是否比 128 在更低的位置上。我们只是想让 值最低的元素能放在列表顶端以便容易访问。列表的其他部分即使是混乱的也不必在意。列表的其他部分只有在我们需要另一个 值最低的元素的时转载 2010-05-22 19:26:00 · 3239 阅读 · 1 评论 -
约瑟夫环问题
Description约瑟夫环问题;有N个人围成一个环,从第一个人开始报数,报到M的人退出环,并且由他的M值来代替原有的M值,要求输出离开环的顺序。Input第一行有2个数,M和N。(0第二行有N个数,表示每个人的M值。Output按照样例的格式,输出所有人退出环的顺序。 Sample Input4 65 4 2 3 4 2Sample Output4,1,2,3,6,5 Source#include"iostream"#include"cstdio"#include"cstdlib"转载 2010-06-12 15:26:00 · 852 阅读 · 0 评论 -
树和二叉树-层序遍历二叉树
<br /> <br />通过上机实践,帮助学生进一步掌握指针变量和动态变量的含义,掌握二叉树的结构特性,以及各种存储结构的特点及适用范围,掌握用指针类型描述、访问和处理二叉树的运算。<br />【实验内容】<br />实验题目一:层序遍历二叉树<br />【实验步骤】<br />1 已知二叉树以二叉链表作为存储结构,写一个算法按层序遍历它,通过程序在终端屏幕上打印出它的层序序列。<br />2 先建立二叉树的二叉链表存储结构,再遍历它。<br />3 利用队列完成算法。<br />编程实现以二叉链表存储的转载 2010-06-11 22:57:00 · 3103 阅读 · 1 评论 -
判断两个链表是否相交
如果两个单向链表相交,一定是形成Y字形,而不会是X字形。基于这个想法,可以判断两链表是否相交。转载 2010-05-23 12:35:00 · 505 阅读 · 0 评论 -
稀疏矩阵
一、稀疏矩阵的定义 对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。 人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素没有分布规律。 二、稀疏矩阵的压缩存储 由于稀疏矩阵中非零元素较少,零元素较多,因此可以采用只存储非零元素的方法来进行压缩存原创 2010-05-24 23:33:00 · 23421 阅读 · 2 评论 -
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链表的方向转载 2010-05-24 22:54:00 · 1178 阅读 · 0 评论 -
单向链表反转
比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:代码Code highlighting produced by Actipro CodeHighlighter (free转载 2010-05-23 12:57:00 · 508 阅读 · 0 评论 -
二叉查找树(binary search tree (BST))--算法导论示例
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3. 它的左、右子树也分别为二叉排序树。二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构。中序遍历二叉排序树可得转载 2010-05-22 23:56:00 · 1109 阅读 · 0 评论 -
关于如何查找数组中和最大的子序列
关于如何查找数组中和最大的子序列问题:给定一个数组,如{-1,3,6,-9,2,-5,-1,9,3,-3},求该数组中的和最大的子序列。思路:最简单的方法,以每个元素作为起点,再考虑1~n所有的子序列元素个数的情况,这样的复杂度就为O(n*n). 之后我们讨论了如何简化数组,比如相邻的正数可以将其绑定,两端的负数可以直接排除,最后数组可以被简化为两端为正数,中间没有相邻正数的形式。然而原创 2010-05-21 21:41:00 · 2516 阅读 · 3 评论 -
如何判断单向链表有环?
昨天去面试了一把,面试官给出了这道题。当时我知道一定有什么巧妙的办法,但是我并没有想到。我只是想到了通用的方法,顺序遍历然后为遍历过的节点依次做标志。也试图去想了些特殊的访法,不过都有一定的局限性。事后得知了下面这个较优的方案。typedef struct NodeTag{ struct type data; node * next;}Node; 题目:如何判断单项链表有死循环?原创 2010-05-21 18:41:00 · 2493 阅读 · 0 评论 -
递归与尾递归
下面两个程序是scheme写的计算阶乘的递归和尾递归实现线性递归:(define (factorial n) (if (=n 1) 1 (* n (factorial (- n 1)))))尾递归:(define (factorial n) (fact-iter 1 1 n))(define (fact-iter product counter max-转载 2010-05-24 23:52:00 · 1023 阅读 · 0 评论 -
c++总结
C++问与答2008-07-23 23:331、在VC的MFC程序中能否使用cout输出?答:不能。必须使用CDC来进行输出。2、C++中子类的构造函数是否会自动调用基类构造函数?答:会。如果在子类的构造函数中不显式指定调用基类构造函数,则将自动调用基类缺省构造函数,所以基类一定要有缺省构造函数。如果子类的构造函数除了调用基类构造函数以外什么都不做,不能不写,必须写一个空函数。3、原创 2010-05-24 22:52:00 · 665 阅读 · 0 评论 -
桶排序
#include void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}int partition(int *a, int low, int high){ int middle = (low + high)/2; for(int i=low,j=high; i { while(a[原创 2010-05-22 14:52:00 · 573 阅读 · 0 评论 -
〔面试题〕无需额外变量交换两个变量的方法
两种方法:1.使用异或1 void swap(int a,int b) 2 { 3 a=a^b; 4 b=b^a; //b^a相当于 b^a^b 也就是 b^a^b的值就是a了, 下边相同 5 a=a^b; 6 } 也有人写成了一句,就是读起来麻烦些:)a^=b^=a^=b; 2.使用加减1 void swap(int a,int b)2 {3 a = a + b ;4 b转载 2010-05-21 19:56:00 · 669 阅读 · 0 评论 -
位图排序
问题:给定输入文件,文件中每条记录是一个整型数(不重复),每条记录最大为n,n限制:主存不超过1MB(实际程序超过了1M)。按照《编程珠玑》上介绍,有以下几种方法:1,多通道分片读取文件,然后合并排序分片文件2,位图排序:适合于对大量不重复数据,并且数据其他相关数据。位图排序就是使用一张表来记录关键字的存在状态(存在或不存在),然后通过采集到的状态(在/不在)通过一次遍历来转载 2010-05-23 21:45:00 · 623 阅读 · 0 评论 -
有10亿个浮点数,找出一万个最大的数
给一个基于最小二叉堆的方案: 第一阶段,向最小二叉堆中插入前一万个浮点数; 第二阶段,从第一万零一个浮点数开始,将之与最小二叉堆顶部的最小值比较。如果小于这个最小值,把最小值弹出并将新值插入到二叉堆中。重复此过程直到遍历完成。 . 创建长度一万的二叉树。 2. 遍历剩余的浮点数,若大于最小值则插入二叉树并删除最小的节点,否则略过。 这基本上是一个较优的算法,复杂度为: 千万级(一万的排序)转载 2010-05-22 21:48:00 · 959 阅读 · 0 评论 -
求字符串全排列
<br />求字符串全排列 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 <br />分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。<br />我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第转载 2010-11-20 12:49:00 · 1139 阅读 · 0 评论