数据结构和算法
inzaghihalo
这个作者很懒,什么都没留下…
展开
-
单链表逆序
第二个题目是很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:图(1)初始状态 初始状态,prev是N转载 2015-02-11 13:34:14 · 424 阅读 · 0 评论 -
排序算法(二)--交换排序之起泡排序,快速排序
交换排序:是借助交换进行排序的方法,其主要思想是:在待排序列中选两个记录,按关键码比较,如果反序则交换他们的位置.起泡排序:基本思想:两两比较相邻元素的关键码,如果反序则交换,直到没有反序元素为止.templatevoid BubbleSort(T array[], int nLen){ int exchange = nLen - 1; int bound = exchange;原创 2016-09-30 13:30:21 · 1141 阅读 · 0 评论 -
排序算法(一)--插入排序之直接插入排序和希尔排序
排序的基本概念排序:排序是将一个任意序列排列成一个按关键码有序的序列排序算法的稳定性:在经过排序后,序列中相同关键码的记录相对位置没有发生改变称为稳定单键,多键排序:根据一个关键码排序叫做单键排序;根据多个关键码进行排序叫做多键排序.排序的分类:根据待排序列是否全部放置在内存中:内排序,外排序.根据排序是否建立在关键码比较的基础上分为基于比较的排序和不基于比较的排序.根据排原创 2016-09-30 09:47:33 · 681 阅读 · 0 评论 -
多维数组与特殊矩阵的压缩存储
数组是由类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素,每个元素受(n>=1)个线性关系的的约束,每个元素在n个线性关系中的序号i1,i2...in称为该元素的下标,并称该数组为n维数组.数组的存储结构与寻址由于数组一般要求实现随机存取,所以一般采用顺序存储结构.由于内存单元是一维,而多维数组是多维的结构,所以采用顺序存储结构存储数组首先需要将多维结构映射到一维结构中.二维原创 2016-09-28 14:15:19 · 1531 阅读 · 0 评论 -
排序算法(五)--归并排序
归并排序归并排序是一种借助归并进行排序的方法,归并的含义是将两个或两个以上的有序序列归并成一个有序序列的过程。归并排序的主要思想是:将若干个有序序列逐步归并,最终成为一个有序序列.二路归并排序是归并排序中最简单的排序方法,其基本思想是:将若干个有序序列进行两两归并,直至所有有序序列都在一个序列中为止。假设待排序序列中有n个记录,则可将整个序列看成是长度为1的n个有序序列.其中一次归原创 2016-10-13 19:27:45 · 554 阅读 · 0 评论 -
排序算法(四)--选择排序和堆排序
选择排序:借助选择进行排序的方法,其主要思想是:每次在待排序列中选出最小的记录,添加到有序序列中.简单选择排序:第i趟排序,通过n-i个元素比较,在n-i+1个元素中找到最小元素,并与第i个元素交换作为有序序列的第i个记录.template void SelectSort(T array[], int n){ for (int i = 0; i<n-1; i++) { in原创 2016-10-13 13:51:10 · 891 阅读 · 0 评论 -
队列的应用--火车车厢重排列
火车车厢重排列问题问题描述:一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号为1--n,即货运列车按照第n站至第1站的次序经过这些车站。为了便于列车卸掉相应的车厢,车厢的编号应与车站的编号相同。使各个车厢按1~n次序排列,这样每次卸掉最后一节车厢即可.所以给定任意次序的车厢,必须重排列它们.可排列的地方是转轨站,转轨站由一个入轨站,一个出轨站,缓冲轨k个.列车由入轨站进原创 2016-09-26 15:59:27 · 6734 阅读 · 0 评论 -
栈的应用举例--递归
栈有一个重要应用就是在程序设计语言中实现递归1.递归的定义:递归(recursion)就是子程序或函数直接调用自己或者通过一系列语句间接调用自己,是一种描述问题和解决问题的基本方法.递归通常用来解决结构自相似的问题.所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决.具体的,这个问题可以划分为两部分:第一部分是一些特殊的情况,有直接的解法;第二部分与原问题原创 2016-09-26 12:55:13 · 1627 阅读 · 0 评论 -
特殊线性表(三)串
1.串是0个或多个字符组成的有限序列。S = "S1S2S3Sn";子串的第一个字符在主串中的序号成为子串在主串中的位置.1)串的顺序存储结构:在PASCAL,C,C++,java等语言中,串的存储和基本操作的实现都是采用顺序存储结构.一般有三种方式表示串的长度:用一个变量来表示串的长度;用一个不会在串中出现的特殊字符表示串的终结,C++中采用'\0';用数组的0号原创 2016-09-26 11:46:19 · 553 阅读 · 0 评论 -
特殊线性表(二)队列
队列是只允许在一端进行插入操作,在一端进行删除操作的线性表,允许插入的一端称为队尾,允许删除的一段称为队头.队列具有先进先出的特性.现实世界有许多问题可以用队列描述,比如排队.而在程序设计中,也经常使用队列记录需要先进先出的方式处理的书,比如键盘缓冲区,操作系统中的作业调度等.1)队列的顺序实现,循环队列.由于单纯的设置头尾指针front,rear,随着头尾指针的移动,会出现假溢出的现原创 2016-09-26 11:25:55 · 478 阅读 · 0 评论 -
特殊线性表(一)栈的C++实现
栈的限定是仅在表尾进行插入和删除操作的线性表.允许插入和删除的一端称为栈顶,另一端称为栈底。栈具有后进先出的特性.栈的实现同样有顺序栈和链栈两种。1)顺序栈:栈的顺序实现比较简单,这里我们讨论一种两栈共享栈空间的顺序栈,它可以避免两个栈时,一个栈满,而另一个栈还有大量存储空间的情况.#define MAX_SIZE 1024template class CBothStack{原创 2016-09-26 11:10:38 · 582 阅读 · 0 评论 -
有关线性表的一些算法题
1.设计一个时间复杂度为O(n)的算法,实现将数组A[n]中所有元素循环右移k个位置举例:a[] = {1,2,3,4,5},循环右移1位后 a[] = {5,1,2,3,4};首先,我们可能想到的算法是,先将数组的后k个元素保存到一个临时数组中,然后将前n-k个元素右移k个位置.然后将临时数组的元素复制到元素的前k个位置.实现:template void MoveArrayAd原创 2016-09-26 10:48:16 · 1979 阅读 · 0 评论 -
线性表之单链表的c++实现
单链表是线性表的一种链式存储结构,它同顺序表(由于顺序表实现比较简单,本文不做讲述了)不同,是用一组任意地址的存储单元,存放线性表中的元素。为了表示结点之间的关系,每个结点不仅要存储它表示的元素,还要存储它下一个结点的信息。下面我们用C++的模版来实现以下单链表:结点定义template struct Node{ Node* pNextNode; T m_value;};单原创 2016-09-25 10:50:34 · 1556 阅读 · 0 评论 -
KMP算法,next数组求解
本文转载地址:http://www.cnblogs.com/c-cloud/p/3224788.html【经典算法】——KMP,深入讲解next数组的求解前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32转载 2016-09-23 16:41:27 · 516 阅读 · 0 评论 -
排序算法(三)--关于快速排序Partition的思考
上一章我们讲解了快速排序,其中快速排序一趟划分的算法Partition.Partition可不只用在快速排序中,还可Selection algorithm(在无序数组中寻找第K大的值)中.甚至有可能正是这种通过一趟扫描来进行分类的思想激发Edsger Dijkstra想出了Three-way Partitioning,高效的解决了Dutch national flag problem问题.接下来我原创 2016-10-09 15:30:51 · 6517 阅读 · 0 评论 -
八皇后问题
1.什么是八皇后问题?八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。而且仅当 n = 1 或 n ≥ 4 时问题有解。八皇后问题最早是由国际西洋棋棋手马克原创 2016-10-28 11:26:36 · 1325 阅读 · 0 评论