
数据结构和算法
文章平均质量分 81
ljianhui
热爱编程,热爱学习IT技术
展开
-
数据结构之线性表、栈、队列
线性表一、定义 线性表是n个数据元素的有限序列。二、线性表的顺序表示和实现即用一组地址连续的储存单元依次存储线性表的数据元素。以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。即是用我们熟悉的C/C++中的数组存储数据元素。只要确定了数据元素的起始位置,就可随机地访问数据元素。但是这种表示方法不便于插入和删除元素,每插入或删除一个元素,都要移动插入或删除位置之后原创 2012-08-07 20:13:26 · 8242 阅读 · 0 评论 -
AVL树的插入删除查找算法实现和分析-1(平衡因子法)
至于什么是AVL树和AVL树的一些概念问题在这里就不多说了,下面是我写的代码,里面的注释非常详细地说明了实现的思想和方法。因为在操作时真正需要的是子树高度的差,所以这里采用-1,0,1来表示左子树和右子树的高度差,而没有使用记录树的高度的方法。代码如下:#define FALSE 0#define TRUE 1#define LH 1#define EH 0#d原创 2013-06-20 15:21:47 · 8703 阅读 · 6 评论 -
使用C语言实现“泛型”链表
看到这个标题,你可能非常惊讶,C语言也能实现泛型链表?我们知道链表是我们非常常用的数据结构,但是在C中却没有像C++中的STL那样有一个list的模板类,那么我们是否可以用C语言实现一个像STL中的list那样的泛型链表呢?答案是肯定的。下面就以本人的一个用C语言设计的链表为例子,来分析说明一下本人的设计和实现要点,希望能给你一点有用的帮助。一、所用的链表类型的选择我们知道,链表也原创 2014-01-25 00:09:03 · 15853 阅读 · 21 评论 -
二叉搜索树转换为有序双向链表
一、问题描述输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。二、实现思路在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种原创 2014-03-28 00:04:30 · 30160 阅读 · 6 评论 -
C++类模板实现数据结构——栈
以下是本人用C++类模板实现的一种数据结构——栈。希望对别人有所帮助,也希望有人给出意见!毕竟我也是很少用模板这东西,新手一个。#ifndef _STACK_H_INCLUDED#define _STACK_H_INCLUDEDtemplateclass _stack{public:_stack(size_t _capacity = 1):capacity(_cap原创 2012-11-27 23:31:23 · 3509 阅读 · 1 评论 -
查找文本文件中的关键字
查找文本文件中的关键字,说白了就是以文本文件作为输入,进行字符串匹配,找返回其第一次出现的下标位置。但是由于数据是以文本文件的形式作为输入的,如何存储和进行匹配就成为了一个问题。下面以两种方法来介绍如何操作。注:本文中采用的字符串匹配算法只是普通的字符串匹配算法,重点在对文件处理和分块查找。一、蛮力法这种方法非常简单,把文件中的所有数据输入到一个字符数组中,然后以数组作为主串,关键原创 2013-12-18 00:36:55 · 28332 阅读 · 7 评论 -
求数组中第k个最小数
一、问题描述给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,例如对于数组x,x = {3,2,1,4,5,6},则其第2个最小的数为2。二、解题思路本算法跟快排的思想相似,首先在数组中选取一个数centre作为枢纽,将比centre小的数,放到centre的前面将比centre大的数,放到centre的后面。如果此时centre的位置刚好为k,则centre为原创 2013-11-06 00:19:04 · 9937 阅读 · 14 评论 -
快速排序中常见中轴选择方法及实现代码
一、选取最后一个元素在我们的课本中,看到最多的就是选择第一个元素作为中轴,但是在很多书上却选择最后一个元素作为中轴。下面就让我们来一睹选取最后一个元素作为中轴的快排。注:本文中的所有算法都采用双向扫描法,即,设两个下标i和j,i和右扫描,j向左扫描,直到i不小于j。而当下标为i的数小于中轴时,跳过并继续向右扫描,否则停止扫描,并开始j的向左扫描,相对地,当下标为j的数大于中轴时,跳原创 2013-11-18 00:29:53 · 14025 阅读 · 9 评论 -
交换两个子数组的位置(只使用1个辅助空间)
一、问题描述其实这是一个非常基本和常用的数组操作,它的描述如下:有一数组X[0...n-1],现在把它发为两个子数组x1[0...m]和x2[m+1...n-1],交换这两个子数组,使用数组x由x1x2变成x2x1,例如x={1,2,3,4,5,6,7,8,9},x1={1,2,3,4,5},x2={6,7,8,9},交换后,x={6,7,8,9,1,2,3,4,5}。二、解题思路原创 2013-11-03 01:19:31 · 8212 阅读 · 12 评论 -
求最大连续子数列和(只扫描一次数列)
一、什么是求最大连续子数列和首先来看看这是个怎样的问题的,问题描述:一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值。注意:当全是负数的情况时,返回最大的那个负数二、解题思路这个问题的思路其实非常简单,从左到右扫描数组,在扫描过程中,记录数组的负数的个数和扫描过中数据中的最大值,并累加每个扫描到的数据的和,假设原创 2013-10-31 23:27:45 · 9662 阅读 · 4 评论 -
单循环赛程安排问题
首先,来解释一下,什么是单循环问题,其实,这是一个我们在实现中经常遇到的问题。问题描述:赛程问题:有N个运动员进行单循环赛,即两个运动员都要与其他所有运动员比赛一次。要求每个运动员每天只进行一次比赛,且整个赛程在N-1天内结束,运动员编号由1到N注:N = 2^k解题思想:看到这个问题,我们的第一种想法当然就是用穷举法,找出一个可行的方案。其实这题并不适合用穷举法去解决,因原创 2013-10-31 00:28:26 · 8189 阅读 · 4 评论 -
二分查找的实现及注意事项
听到二分查找,大家可能都会觉得它非常简单,从而会自然而然地忽略它。那么在实现这个看似简单的算法过程中有没有什么值得注意的地方呢?下面是我写的一个二分查找的实现int binary_search(int array[],int n,int value){ int begin = 0, end = n-1, mid = 0; bool flag =0; //判原创 2013-06-20 00:31:45 · 3809 阅读 · 6 评论 -
二叉树常用操作算法集、解释及注意事项
二叉树是一种常用的数据结构,在程序中也经常需要使用二叉树,但是你所使用语言却并不一定提供了二叉树这种数据类型,所以为了方便使用,我们可以自己实现一个二叉树的数据类型。在需要时就像使用其他已定义的类型一样方便。下面给出一些本人写的算法和解释(基于C语言),希望对读者写一个二叉树数据类型有所帮助。0、递归的四条基本法则由于二叉树中的算法大多使用递归来实现,而且使用递归实现也原创 2013-07-06 11:59:07 · 9416 阅读 · 9 评论 -
初窥数据结构
初窥数据结构 由于今晚开会,伟杰师兄会说数据结构,所以今天下午就用了一点时间看了一下数据结构,谈谈今天的收获吧!首先,知道了什么是数据结构,数据结构是指数据以及相互之间的联系,可以看作是相互之间存在着某种特定关系的数据元素的集合,可以把数据结构看成是带结构的数据元素的集合。 然后了解了数据结构包括哪些方面。1、数据元素之间的逻辑关系,即数据的逻辑结构。2、数据元素及其关系在计算机存储原创 2012-07-12 22:37:22 · 2402 阅读 · 1 评论 -
C++类模板实现循环队列
以下是本人用C++类模板实现的一种数据结构——循环队列。希望对人们有所帮助,也希望人们提出宝贵的意见!//循环队列#ifndef _QUEUE_H_INCLUDED#define _QUEUE_H_INCLUDEDtemplateclass _queue{ public: _queue(size_t _capacity = 1):原创 2012-11-28 20:03:13 · 4098 阅读 · 0 评论 -
KMP字符串模式匹配详解
KMP字符串模式匹配详解来自CSDN A_B_C_ABC 网友KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一. 简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int po转载 2012-08-20 22:45:11 · 1519 阅读 · 0 评论 -
AVL树的插入删除查找算法实现和分析-2(树高度法)
在前一篇文章(AVL树的插入删除查找算法实现和分析-1(平衡因子法))中,介绍了如何用平衡因子记录左右子树的高度差的方法来实现AVL树的插入删除和查找的算法,并分析了这种方法的一些缺陷,这里,我将会使用另一种方法来实现这些算法,而且个人觉得比前一篇文章的所写实现更加简单,思路更加清晰。在介绍这种方法之前,先说说怎么样求一棵二叉树的高度(或深度)。其代码和解释如下:int BiTre原创 2013-06-29 22:15:04 · 9313 阅读 · 24 评论