数据结构与算法设计
JXH_123
这个作者很懒,什么都没留下…
展开
-
基础算法
1. prim算法2. Kcruckal算法3. Belkman Ford4. Dijstra5. Floyd算法6.求关键路径算法原创 2014-05-22 17:19:22 · 678 阅读 · 0 评论 -
常见面试题之单链表
参考文献:1.《编程之美》2.《剑指offer》3.《王道程序员求职宝典》常见题如下:1.链表的创建、增加、原创 2014-09-29 10:43:50 · 708 阅读 · 0 评论 -
常见面试题之二叉树
参考文献:1.《编程之美》2.《剑指offer》3.《王道程序员求职宝典》常见题如下:1.二叉树的三种遍历方式(递归与非递归)。2.层次遍历二叉树的方法。3.如何判断一颗二叉树是否为AVL树。4.找出二叉树上任意两个阶段的最近公共祖先。5.二叉树中找出和为某一值的所有路径。6.如何将一个有序数组放到二叉树中。7原创 2014-09-29 10:41:11 · 821 阅读 · 0 评论 -
常见面试题之数组
参考文献:1.《编程之美》2.《剑指offer》3.《王道程序员求职宝典》常见题如下:1.二维数组中查找某个数,该数组满足:左->右:递增,上->下:递增。------->利用二分查找的思想2.求旋转数组中的最小数字。3.利用循环优化斐波那契数列。4.调整数组顺序,使奇数位于偶数之前。5.求数组中出现出现次数超过一半的数组。6.输入N个整数,找出其中最小的k原创 2014-09-29 10:37:19 · 959 阅读 · 0 评论 -
二叉树遍历递归与非递归实现
二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程。 二叉树的遍历分为:前序遍历(也叫先序遍历)、中序遍历、后序遍历。所谓前、中、后都是根据当前子树根结点相对左右孩子的位置而言,也就是说:原创 2014-08-01 21:06:07 · 1031 阅读 · 0 评论 -
算法题:求数组中最小的k个数
题目:输入n个整数,找出其中最小的k个数。 《剑指offer》给出了两种实现算法: 算法1:采用Partition加递归法,该算法可以说是快速排序和二分查找的有机结合。算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值。 算法2:采用top-k算法。如果要找最小的K个数,我们才用一个含有K个值的大顶堆;如果要找最大的K个数,我们采用小顶堆。该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序。原创 2014-08-06 21:15:51 · 2480 阅读 · 0 评论 -
算法题:复制复杂链表之空间换时间法
题目:复制一个复杂链表,所谓复杂链表指的是每个节点含有两个指针,一个指向单链表的下一个结点,一个指向单链表中的任意某个结点,或者该指针为空。 为了方便起见,我们将待复制的链表称为原型链表,将复制后的新链表称为复制链表,将指向下一个结点的指针定义为next指针,指向其他位置的指针定义为any指针。《剑指offer》上给出了三种解决方法:(1)常规法;(2)空间换时间法;(3)紧随复制法。书上并给出了第三种方法的实现代码。这里我根据书上的提示,给出第二种方法的代码。原创 2014-08-05 20:08:34 · 1307 阅读 · 0 评论 -
算法题:复制复杂链表之复制连接法
上篇文章算法题:复制复杂链表之空间换时间法我们给出了用映射的方法来为新复制的链表中的每个结点设置any指针,本文给出的是《剑指offer》上给出的算法与代码,《剑指offer》上提到该算法的实现三个步骤: 第一步:复制原始链表的任意结点N并创建新结点N',在把N'连接到N的后面; 第二步:设置每个结点的any指针; 第三步:将长链表分成两个链表,一个是原始链表,另外一个就是我们所要求的复制链表。 为了能够更加明显第理解整个求解过程,我们同样给出如下图:原创 2014-08-05 20:24:12 · 1094 阅读 · 1 评论 -
算法题:打印1到最大的n位数
今天看到剑指offer上的第12题,题目如下: 输入数字n,按顺序打印出从1到最大的n位十位数。比如输入3,则打印出1,2,3,...,999。 当我看到这个题目的时候,第一感觉就是用递归,为什么呢?首先得从我们的一个实际数字出发,比如123,我们对数字加1,实际上分为如下两个步骤: 步骤1:最低位加1; 步骤2:若发生进位,则向更高位传播该进位的影响(这也是递归的所在)。 在完成这个算法题之前,我想插一句“细节决定成败!”,我们写一个程原创 2014-08-04 09:26:28 · 1450 阅读 · 1 评论 -
算法题:合并两个有序的链表
题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) 这个算法很像我们排序算法中的归并排序,只能说“很像”,因为思想是一样的,但是这个与归并排序还是有区别的,区别如下: 1.归并排序是针对有序数组,而这里是有序链表; 2.归并排序排序的时间复杂度为o(nlogn),而这里的时间复杂度最坏情况下为O(m+n),最好的情况下为原创 2014-08-04 16:50:56 · 25879 阅读 · 0 评论 -
算法题:反转单链表
题目:存在一个单链表,头指针为head,实现单链表的反转Node *Reverse(Node *head)。 该算法的求解办法有很多,如: 方法1:先顺序变量单链表,将结点保存到栈中,在从栈中弹出结点,重新建立一个新的单链表; 方法2:用《剑指offer》里面给出的算法,用三个指针来实现; 方法3:采用递归实现,是方法2的递归实现形式。 本文主要给出方法2和方法3,在给出具体的代码之前,先要注意几个问题:原创 2014-08-04 15:01:03 · 2400 阅读 · 0 评论 -
算法题:求链表倒数第K个结点
题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个。 《剑指offer》上面给的解法是设置两个指针,这里记为p1、p2,先让p2走(k-1)步,然后p1、p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点。 我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步;(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL。显然这样不太容易控制,我的想法是:先让p2先走k步,然后p原创 2014-08-04 13:34:40 · 1616 阅读 · 0 评论 -
数据结构之二分查找树
二分查找树(也叫二叉查找树、二叉排序树)的提出是为了提供查找效率,之所以称为二分查找树,因为该二叉树对应着二分查找算法,查找平均的时间复杂度为o(logn),所以该数据结构的提出是为了提高查找效率。原创 2014-07-02 20:52:24 · 5761 阅读 · 1 评论 -
数据结构之AVL树
在前面的博文中,我们已经介绍了数据结构之二分查找树的相关知识,二分查找的提出主要是为了提高数据的查找效率。同一个元素集合可以对应不同的二分查找树BST,二分查找树的形态依赖于元素的插入顺序。同时我们也已经知道,如果将一个有序的数据集依次插入到二查找树中,此时二分查找树将退化为线性表,此时查找的时间复杂度为o(n)。为了防止这一问题的出现,便有了平衡二叉树AVL的存在价值。平衡二叉树从根本上将是为了防止出现斜二叉树的出现,从而进一步提高元素的查找效率,保证元素查找的时间复杂度为o(logn),显然,平衡二叉树原创 2014-07-03 12:19:14 · 1238 阅读 · 0 评论 -
C++实现二叉树的建立和三种递归遍历
二叉树是一种常见的数据结构,二叉树的遍历也是家常便饭的事了,这里仅仅写出一个完整的可以运行的C++代码来随便建立一个如下图所示的二叉树,建一棵二叉树是实现二叉树各种操作的基础,下面的程序也很简单,这只是二叉树练习的开始,以后的博文中,将会紧紧围绕这棵二叉树练习更多的操作:如求二叉树的大小,二叉树的深度,翻转二叉树...,这里只是基础中的基础,只是为以后的学习做铺垫。原创 2014-06-30 20:16:18 · 4258 阅读 · 0 评论 -
常用的排序算法的C++实现
#include<iostream>using namespace std;void swap(int &i,int &j)//实现i,j交换的函数{ i=i^j; j=i^j; i=i^j;}void Display(const int *arr,int length){ if(arr==NULL || length<=0) { ret...原创 2014-04-03 12:35:08 · 1237 阅读 · 4 评论