
数据结构与算法
Hansionz
但愿一切
展开
-
从斐波那契开始了解尾递归
从斐波那契开始了解尾递归尾递归(tail recursive),看名字就知道是某种形式的递归。简单的说递归就是函数自己调用自己。那尾递归和递归之间的差别就只能体现在参数上了。尾递归wiki解释如下:尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说...转载 2018-11-21 13:56:28 · 276 阅读 · 0 评论 -
二叉搜索树的经典应用面试题(key&key-value模式)
0.题目 1.假设给你一篇英语文章,又给你一个在这个英语文章中的英语单词,让你检查这个英语单词是否拼写正确。 2.假设给你一篇英语文章,如何才能求出文章中所有单词重复出现的次数呢? 1.思路1.第一题是key模式,我们可以将这篇英语文章中的所有正确的单词都放在一颗二叉搜索树中,然后在二叉搜索树搜索这个单词,如果在二叉搜索树中,则必然是正确的;如果不在,则是错误的。...原创 2018-08-25 16:20:13 · 1795 阅读 · 0 评论 -
合并两个已排序的链表
0.题目 输入两个递增排序的链表,合并这两个链表并使得新的链表依然是递增有序的。 1.解题思路递归方法:首先比较给新链表接上一个结点,然后这个结点的next就是剩下的两条链表合并的结果。 pNode Merge_R(pLinkList list1, pLinkList list2){ //处理链表为空 if (list1 == NULL)...原创 2018-09-01 11:53:38 · 403 阅读 · 0 评论 -
二叉树的镜像(递归&非递归)
栈的基本操作 https://blog.youkuaiyun.com/hansionz/article/details/81636557二叉树的镜像 镜像,通俗的理解就是在镜子里看到的东西。对于二叉树的镜像,其实就是交换它的左右子树,当然是递归的,就是它的左右子树的左右子树等都要交换。 例如:递归:首先交换根节点的左右子树,如果根节点的左子树不为空,递归交换左子树的左右子树,如果...原创 2018-08-21 17:23:19 · 10434 阅读 · 3 评论 -
二叉树的前序、中序、后序的遍历(递归&非递归)
前言:二叉树的非递归遍历需要用到栈的一些操作,所以贴出栈的相关操作的链接 https://blog.youkuaiyun.com/hansionz/article/details/81636557定义数据结构typedef char BTDataType; typedef struct BinaryTreeNode{ BTDataType _data; struct Bin...原创 2018-08-21 16:54:01 · 1301 阅读 · 0 评论 -
二叉树基础操作总结
1.定义数据结构//二叉树typedef char BTDataType; typedef struct BinaryTreeNode{ BTDataType _data; struct BinaryTreeNode* _left; struct BinaryTreeNode* _right;}BTNode;2.各个函数接口声明//创建一个...原创 2018-08-21 15:17:50 · 5093 阅读 · 0 评论 -
【LeetCode】:从尾结点到中间结点隔断向前边的链表插入结点
0.题目 Given a singly linked list L: L 0→L 1→…→L n-1→L n, reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→… You must do this in-place without altering the nodes’ values. For example, Given...原创 2018-08-28 09:24:40 · 243 阅读 · 0 评论 -
二叉搜索树中删除一个结点(递归&非递归)
1.思路思路:在链式结构中,要删除一个结点,我们常规的做法是找到要删除结点的前一个结点,把它的和一个结点,挂在前一个结点上,但是对于二叉搜索树,既要删除一个结点,又要满足二叉搜索树的性质,是相对于比较难的。 二叉搜索树的删除大致分为以下类: 对于以上的四类要删除的结点,其实我们还可以在具体一些,将一二三类归在一起,第四类是一类。 下面是两类删除结点的方法 ...原创 2018-08-23 21:52:20 · 3360 阅读 · 2 评论 -
二叉搜索树中插入一个结点
1.思路思路:遇到插入结点这种题目,就大致分为两个步骤。1.找到合适的插入位置2.修改指针指向,将给定结点插入 那么在一棵二叉搜索树中要怎么找到合适的插入位置呢?其实也很简单,就是根据二叉搜索树的性质,既二叉搜索树的根节点大于二叉树左子树中的所有结点,小于右子树中的所有结点。将给定值按照这个性质和根节点比较,确定左右子树,在左右子树里继续查找插入的位置,当这个位置为空时,它的...原创 2018-08-23 18:09:11 · 5571 阅读 · 0 评论 -
二叉搜索树面试题总结
0.什么是二叉搜索树 二叉搜索树就是左子树所有结点都小于根结点,右子树所有结点都打于根节点。当然这个定义递归的,它的左右子树也满足这个特点 例如: 0.定义结构typedef int BSTDataType;//定义二叉搜索树结点类型typedef struct BSTreeNode{ BSTDataType _data; struct ...原创 2018-08-23 17:47:59 · 1898 阅读 · 0 评论 -
堆的基础操作总结
1.定义结构//定义堆结构(动态线性表实现)typedef int HTDataType;typedef struct Heap{ HTDataType* _a; int _size; int _capacity;}Heap;2.接口声明//初始化堆void HeapInit(Heap* hp, HTDataType* a, int n);/...原创 2018-08-23 17:17:11 · 453 阅读 · 0 评论 -
哈希表的基础操作总结(插入、查找、删除等)
0.定义结构typedef int HTKeyType;typedef char HTValueType;//枚举哈希表中每一个数据的三种状态typedef enum State{ EMPTY,//空 EXITST,//存在数据 DELETE//已被删除}State;//定义哈希表中数据类型typedef struct HashData{ S...原创 2018-08-25 16:30:22 · 15167 阅读 · 5 评论 -
【剑指offer】:求旋转数组中最小的数字
0.题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组,该数组的最小值为1。...原创 2018-08-29 22:35:46 · 190 阅读 · 0 评论 -
双向循环带头链表的基础操作(增删改查)
1.定义链表结点的结构 typedef int CLDataType; //结点类型 typedef struct ListNode { CLDataType _data; struct ListNode* _next; struct ListNode* _prev; }ListNode; //链表的头 typedef struct List { ListN...原创 2018-10-07 16:18:23 · 2561 阅读 · 1 评论 -
计数排序
一.什么是计数排序计数排序原创 2018-10-11 12:13:32 · 737 阅读 · 0 评论 -
常见排序算法总结及性能比较
常见排序算法总结及性能比较一.常见排序算法有哪些二. 插入排序1.直接插入排序2.希尔排序三.选择排序1.直接选择排序2.堆排序四.交换排序1.冒泡排序2.快速排序五.归并排序1.归并排序六.各算法性能比较一.常见排序算法有哪些二. 插入排序1.直接插入排序基本思想:插入排序是每次将一个待排序的记录,按照大小,插入到前面已经排好的有序区中适当的位置,直到将所有记录插入完位置。大概思想...原创 2018-09-24 14:33:39 · 5646 阅读 · 0 评论 -
快速排序总结(QuickSort)
快速排序一.什么是快速排序1.快排的本质2.快排的思想3.代码实现二.一次快排(partsort)常见实现方式1.hoare版本一.什么是快速排序1.快排的本质快速排序是Koare在1962年提出的一种二叉树结构的交换排序,它实际上是一种对于冒泡排序改进的一种方法。2.快排的思想在待排序序列中任意取一个元素作为基准元素,按照该基准元素将待排序序列分为两个子序列,左边子序列的值都小于基准值...原创 2018-09-24 11:57:48 · 1731 阅读 · 0 评论 -
海量数据处理面试题
海量数据处理思路分析题1.给一个超过100G大小的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址?解决方法:哈希切割topK。将100G的大文件分成1000份,根据同一个哈希函数HashFunc将ip映射到向对应的文件(每个文件的大小可以在内存中处理)中,相同的ip一定会被放在同一个文件中。然后处理每一个文件,找出出现次数最多的ip,每个文件中最大的value对...原创 2018-09-10 20:45:25 · 521 阅读 · 0 评论 -
布隆过滤器实现(哈希+位图)
布隆过滤器(bloomfiliter)布隆过滤器是哈希和位图的变形,它的基本思想是:通过一个Hash函数将一个元素映射成一个位矩阵中的一个点,我们只需查看这个位置是1还是0就知道集合中是否存在它。但是由于哈希冲突的原因,即不同的元素经过散列函数后可能产生相同的哈希地址,我们很可能导致误判。为了降低误判的概率,我们将一个元素经过多个散列函数映射到多个位上,如果这几个位都为1,我们认为它是存在的;...原创 2018-09-10 17:05:38 · 2482 阅读 · 1 评论 -
位图的实现(BitSet||BitMap)
0.位图的概念 在哈希表中,如果要在表中存放一个整数,此时就要申请一个整型的空间来存放它,一个整型数据在32位或64位平台下都占4个字节。但是如果现在需要存储的数据是40亿个不重复的无符号整型,就需要160亿个字节来存储,1GB的内存是10亿个字节,那么160亿个字节需要16GB的内存来存放这些数据,而我们普通的电脑内存一般都是4G的内存,这显然是存放不下的。这就引入了位图的概念:内...原创 2018-09-10 09:38:22 · 2147 阅读 · 0 评论 -
哈希桶的各操作总结(拉链法)
0.定义结构//哈希表中结点的类型(拉链法)typedef struct HashNode{ struct HashNode* _next; HTBKeyType _key; HTBValueType _vaule;//key-value模型}HashNode;//哈希表的类型typedef struct HashTableBucket{ Has...原创 2018-09-06 16:28:08 · 890 阅读 · 0 评论 -
链表的基础操作
0.定义结构typedef int DataType;//链表结点typedef struct Node{ DataType data; struct Node * next;}Node,*pNode,LinkList,*pLinkList;1.定义接口/初始化链表void InitLinkList(pLinkList *ppl);//尾插void...原创 2018-09-03 23:38:37 · 247 阅读 · 0 评论 -
【Sort1】直接插入排序和希尔排序
一.直接插入排序单独总结我的另一篇博客: https://blog.youkuaiyun.com/hansionz/article/details/80835834//直接插入排序int InsertSort(int *num,int len){ assert(num); int i = 0; //第一个元素已经为有序序列,所以要进行len-1次排序 for ...原创 2018-09-11 19:08:52 · 589 阅读 · 0 评论 -
【剑指offer】:已知前序、中序序列,重建一颗二叉树
0.题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。1.思路2.代码实现//重建二叉树BTNode* ReplaceBuildBT(BTDataType* prev_start,...原创 2018-08-27 22:57:03 · 785 阅读 · 0 评论 -
【剑指offer】:青蛙跳台阶及变态跳台阶问题
0.题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)原创 2018-08-30 22:58:12 · 543 阅读 · 0 评论 -
链表面试题总结
一.定义数据结构typedef int DataType;typedef struct Node{ DataType data; struct Node * next;}Node,*pNode,LinkList,*pLinkList;二.各题目函数声明//从尾到头打印链表void PrintLinkTailToHead(pLinkList pl);...原创 2018-08-12 23:20:39 · 1281 阅读 · 0 评论 -
【剑指offer】:在O(1)的时间删除链表结点(第13题)
题目描述 给定一个单向链表的头指真和结点指针,定义一个函数在O(1)的时间内删除该结点。链表,链表结点和函数定义如下://链表结点typedef struct ListNode{ int m_nValue; struct ListNode* next;}ListNode,*pListNode;//函数void DeleteNode(pListNode* pL...原创 2018-07-05 23:03:21 · 324 阅读 · 0 评论 -
【剑指offer】:从尾到头打印单链表(第5题)
定义链表结点typedef int datatype;typedef struct Node{ datatype data; struct Node *next;}Node, *pLinklist;思路一:递归实现 要想将链表从尾到头打印,我们首先想到的方法应该是递归,每次访问到一个结点的时候,递归访问后面结点,最后打印自己。代码实现voi...原创 2018-07-03 23:39:52 · 277 阅读 · 0 评论 -
迷宫求解(1)课程设计之简单实现
问题描述 迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图所示,求出一条从入口...原创 2018-07-03 16:53:38 · 13469 阅读 · 3 评论 -
【排序】:插入排序(InsertSort)及优化
插入排序(InsertSort) 插入排序是每次讲一个待排序的记录,按照大小,插入到前面已经排好的有序区中适当的位置,直到将所有记录插入完位置。大概思想是将待排序记录放在数组R[0..N]中,R[0]是有序区,R[1..N]为无序区,无序区从R[1]开始按照大小插入到有序区中。以记录R[n]={7,6,2,4,3,0}为例,进行选择排序(升序)。代码实现:void Inser...原创 2018-06-27 22:19:36 · 745 阅读 · 0 评论 -
顺序表和链表的优缺点
顺序表优点: 1.方法简单,基于数组,容易实现 2.不用为表示结点间的逻辑关系而增加额外的开销 3.顺序表可以按照元素下标随机访问缺点: 1.在插入和删除时大约移动平均一半的元素,对比较大的顺序表操作时效率很低 2.需要预先分配足够大的空间,估计过大,导致空间浪费;估计过小,会造成溢出链表优点: 1.不用事先分配空间,用一个空间开辟...原创 2018-06-25 23:26:04 · 7325 阅读 · 0 评论 -
链表的基本操作总结
定义一个链表typedef int DataType;typedef struct Node{ DataType data; struct Node * next;}Node,*pNode,LinkList,*pLinkList;pLinkList list;链表的操作接口//初始化一个链表void InitLinkList(pLinkList ...原创 2018-06-25 22:07:27 · 550 阅读 · 0 评论 -
【排序】:选择排序(SelectSort)及其优化
选择排序(SelectSort) 选择排序的基本思想:刚开始的时候,有序区没有元素,每一趟在无序区中选出来一个最小的元素,然后与无序区第一个元素交换,则此时有序区多一个元素,而无序区少一个元素,知道无序区元素为0结束。 直接选择排序:第一趟排序在R[0..n]中选出一个最小的元素与R[0]交换,第二趟在R[1..n]中选择最小元素,与第一个与R[1]交换,直到无序区的元素只剩下一个排...原创 2018-06-29 22:39:15 · 7689 阅读 · 2 评论 -
顺序表的基本操作和几道常见面试题总结
定义顺序表typedef int DataType;#define MAX 100//定义顺序表typedef struct SeqList{ DataType data[MAX]; int sz;//标识顺序表里边现在有多少个元素}SeqList,*pSeqList;顺序表的接口//初始化顺序表void InitSeqList(pSeqList ...原创 2018-06-25 12:14:33 · 617 阅读 · 0 评论 -
【剑指offer】:复杂链表的复制(第26题)
问题描述 实现函数ComplexLinkNode* Clone(ComplexLinkNode* pHead)复制一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指针指向链表中任意一个结点或者是NULL。定义链表结点typedef struct Node{ datatype data; struct Node...原创 2018-08-12 23:36:43 · 200 阅读 · 0 评论 -
在探迷宫(2)--迷宫路径之最优解(带环或不带环)
迷宫问题(1)–课程设计之简单实现(只找出一条通路即可) https://blog.youkuaiyun.com/hansionz/article/details/80901089原创 2018-08-15 23:17:45 · 957 阅读 · 0 评论 -
【剑指offer】:Fibonacci数列
0.什么是Fibonacci数列?例如:0 1 1 2 3 5 8 13.....它被定义为: 1.题目原创 2018-08-30 21:28:51 · 171 阅读 · 0 评论 -
时间复杂度和空间复杂度
时间复杂度和空间复杂度是衡量一个算法复杂度的重要依据,所以它对我们分析算法和写代码很重要时间复杂度:语句总的执行次数与问题规模n的函数表达式一般算法时间复杂度的计算方法:用常数1取代运行时间中所有的加法常数在修改后的运行次数函数中,只保留最高阶如果最高阶项系数存在而且不是1,则去除与这个项相乘的常数,把它变为1空间复杂度:函数中创建对象的个数关于问题的规模函...原创 2018-08-17 18:32:19 · 899 阅读 · 0 评论 -
双向循环带头链表基本操作总结
定义类型typedef int CLDataType;//结点类型typedef struct ListNode{ CLDataType _data; struct ListNode* _next; struct ListNode* _prev;}ListNode;//链表类型typedef struct List{ ListNode* _he...原创 2018-08-17 13:54:26 · 375 阅读 · 0 评论 -
判断二叉树是不是一颗完全二叉树
二叉树的基础操作总结 https://blog.youkuaiyun.com/hansionz/article/details/81908134 队列的基础操作总结 https://blog.youkuaiyun.com/hansionz/article/details/81636644 层次遍历 https://blog.youkuaiyun.com/hansionz/article/details/81947834...原创 2018-08-22 17:50:35 · 2151 阅读 · 1 评论