数据结构&算法
liuyi1207164339
这个作者很懒,什么都没留下…
展开
-
数据归一化和两种常用的归一化方法
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。以下是两种常用的归一化方法: 一、min-max标准化(Min-Max Normalization)转载 2015-07-30 19:33:44 · 2577 阅读 · 0 评论 -
《大话数据结构》第9章 排序 9.10 总结回顾
本章内容只是在讲排序,我们需要对已经提到的各个排序算法进行对比来总结回顾。 首先我们讲了排序的定义,并提到了排序的稳定性,排序稳定对于某些特殊需求来说是至关重要的,因此在排序算法中,我们需要关注此算法的稳定性如何。 我们将排序记录是否全部被放置在内存中,将排序分为内排序与外排序,外排序需要在内外存之间多次交换数据才能进行。我们本章主要讲的是内排序的算法。转载 2016-03-31 23:22:02 · 416 阅读 · 0 评论 -
堆排序
代码如下:/************************************************************************//* 堆排序 *//*********************************************原创 2016-03-08 19:13:20 · 370 阅读 · 0 评论 -
希尔排序
希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。其又称为缩小增量排序,它是是一种插入排序,是直接插入排序算法的一种威力加强版。以下是希尔排序过程:以下是代码:原创 2016-03-05 22:49:04 · 552 阅读 · 0 评论 -
计数排序
所谓排序算法,无非就是把正确的元素放到正确的位置,计数排序就是计算相同key的元素各有多少个,然后根据出现的次数累加而获得最终的位置信息。计数排序不是基于比较的排序算法,时间效率为O(n),是最快的排序算法!但是计数排序有两个限制条件:1、存在一个正整数K,使得数组里面的所有元素的key值都不大于K2、key值都是非负整数。以下代码是经过改进的计数排序代码:vo原创 2016-03-08 20:39:31 · 699 阅读 · 0 评论 -
基数排序
基数排序与之前的方法有所不同,它不需要比较关键字的大小。它是根据关键字中各位的值,通过对排序的N个元素进行若干趟“分配”与“收集”来实现排序的。 不妨通过一个具体的实例来展示一下,基数排序是如何进行的。 设有一个初始序列为: R {50, 123, 543, 187, 49, 30, 0, 2, 11, 100}。我们知道,任何一个阿拉伯数,它的各个位转载 2016-03-08 21:54:33 · 534 阅读 · 0 评论 -
插值查找法
插值查找是要根据关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值公式:(key-a[low])/(a[high]-a[low]),从时间复杂度来说,它也是O(logn)的,但对于表比较长,而关键字分布又比较均匀的查找表来说,插值算法的平均性能要比折半查找好得多。反之,如果数组中分布极端不均匀,用插值查找未必是很合适的选择。代码如下:int insert原创 2016-04-12 10:48:25 · 1420 阅读 · 1 评论 -
二分查找算法
基本的二分查找法:int binary_search(int* a, int len, int goal){ int low = 0; int high = len -1; while (low <= high) { int middle = (high - low) / 2 + low; // 直接使用(high + low) / 2 可能导原创 2016-04-12 10:31:12 · 702 阅读 · 0 评论 -
最长回文子串-Manacher算法
题目来源:程序员代码面试指南主要是Manacher算法的使用,具体请参考程序员代码面试指南P483,有很详细的介绍。题目,来自牛客网:对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。测试样例:"abc1234321ab",12返回:7转载 2016-04-09 09:57:48 · 817 阅读 · 0 评论 -
字符串匹配—KMP算法
代码来源:程序员代码面试指南主要是KMP算法的使用,具体请参考程序员代码面试指南P491,有很详细的介绍。题目,来自牛客网:题目描述对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。测试样例:"a转载 2016-04-10 11:18:17 · 539 阅读 · 0 评论 -
链表相关操作
#include #include using namespace std;//链表结构体struct ListNode{ int m_nValue; ListNode*m_pNext;};//是否为空bool isEmpty(ListNode*list){ return list->m_pNext == NULL;}//position是否是最后一个bool isLa原创 2016-04-21 23:02:40 · 701 阅读 · 0 评论 -
把字符串转换成整数
bool g_InputIsInvalid=true;//默认输入不合法 //核心转换函数 int StrToIntCore(string str,bool bInputIsMinus){ int index=0; int num=0; while(str[index]!='\0'){ if(str[index原创 2016-05-07 16:56:14 · 582 阅读 · 0 评论 -
快速排序、基准元的选取及其优化
1 快速排序的基本思想快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。2 快速排序的三个步骤1) 选择基准:在待排序列中,按照某种方式挑出原创 2016-03-08 17:07:49 · 10649 阅读 · 3 评论 -
二叉树系列——二叉树的定义以及各种遍历方式
二叉树的三种遍历都是用递归实现,代码如下://二叉树定义struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode*m_pRight;};//前序遍历void PreOrderTraverse(BinaryTreeNode*tree){ if (tree==NULL) {原创 2016-03-15 23:04:15 · 712 阅读 · 0 评论 -
二叉树系列——根据前序和中序、中序和后序构建二叉树
来自剑指offer面试题6:思路:在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值得左边,而右子树的节点的值位于根节点的值的左边。所以需要扫描中序遍历,才能找到根节点的值。既然已经分别找到了左、右子树的前序序列和中序遍历,我们可以用同样的方法去构建左右子树。也就是说,接下来的事情可以用递归的方原创 2016-03-16 14:30:25 · 2815 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和原创 2016-03-08 15:14:15 · 431 阅读 · 0 评论 -
直接插入排序
直接插入排序的思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。代码如下:/************************************************************************//* 插入排序 */原创 2016-03-05 22:01:37 · 350 阅读 · 0 评论 -
二叉树系列——两个节点的最低公共祖先
出处:https://segmentfault.com/a/1190000003509399二叉搜索树:Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.According to the definition of LCA转载 2016-03-17 14:31:03 · 5668 阅读 · 0 评论 -
如何学好数据结构和算法
数据结构和算法是计算机科学中最重要的课程,作为一名Google的软件工程师,我经常看到一些求职者或刚毕业的学生,他们对于数据结构和算法的学习是远远不够的。这不是说他们看的书是有问题的,或教授们教错了内容,而是学生对这个课程的理解是不到位的。 扎实掌握数据结构和算法的关键并不是要对每一种数据结构和它的子形式都做详尽的调查,然后记住它们的时间复杂度和空间复杂度。记住这些看起来很棒,转载 2015-09-09 10:22:05 · 7993 阅读 · 2 评论 -
二叉树系列——二叉树的深度
剑指offer,面试题39 题目1思路:求出左子树的深度以及右子树的深度,树的深度就是左右子树的深度的最大值+1。使用递归实现,代码如下:/************************************************************************//*//二叉树的深度剑指offer,面试题39 题目1 *//******原创 2016-03-15 22:38:33 · 740 阅读 · 0 评论 -
二叉树系列——层序遍历二叉树
剑指offer面试题23思路:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的队尾。接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,知道队列为空。代码如下:二叉树的结构://二叉树定义struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft;原创 2016-03-15 22:58:01 · 998 阅读 · 0 评论 -
二叉树系列——二叉树的宽度(百度面试题)
所谓二叉树的宽度是指:二叉树各层节点个数的最大值。我们知道层序遍历二叉树是使用deque来实现的:每次打印一个节点之后,如果存在左右子树,则把左右子树压入deque,那么此时的队列中可能既包含当前层的节点,也包含下一层的节点。而我们要求的是对于特定某一层的节点的个数,因此我们需要从头结点开始,记录每一层的个数,对于当前层的每一个节点,在弹出自身之后把其左右子树压入deque,当把当原创 2016-03-16 09:32:54 · 19282 阅读 · 2 评论 -
二叉树系列——二叉树的镜像
来源:剑指offer 面试题19思路:我们先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像。下面是代码://二叉树定义struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode原创 2016-03-16 10:02:09 · 492 阅读 · 0 评论 -
二叉树系列——二叉树的最大距离(即相距最远的两个叶子节点,编程之美,百度面试题)
来自于编程之美3.8。题目:如果我们把二叉树看做图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。如下图所示,树中相距最远的两个节点为A,B,最大距离为6。书上对这个问题的分析是很清楚的,计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深原创 2016-03-15 21:23:17 · 39419 阅读 · 5 评论 -
二叉树系列——判断一个序列是不是一棵二叉搜索树的遍历序列
来自剑指offer面试题24:二叉搜索树的后序遍历序列思路:在后序遍历序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值。他们都比根节点的值要小;第二部分是右子树的值,他们都比根节点的值都要大。接下来我们可以用同样的方法确定与数组每一部分对应的子树的结构。这其实是一个递归的过程。下面是代码:/***************原创 2016-03-16 15:26:40 · 2864 阅读 · 0 评论 -
一道值得深思的面试题:写一个函数,返回一个数组中所有元素被第一个元素除的结果。
第一眼看到这个题,大家一定会说:这还不简单嘛,用一个for循环不就搞定了嘛!然后不不到一分钟就写出了如下代码:#include using namespace std;void divArray(float*arrSquence,int nLength){ if (arrSquence==NULL||nLength<=0) { return; } for (int i =原创 2016-03-16 15:49:18 · 3262 阅读 · 1 评论 -
二叉树系列——路径系列:二叉树中和为某一值的路径
来自剑指offer 面试题25题目:输入一棵二叉树,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径。之前讲了怎么求根节点到叶子节点的路径。所以对于这一个题,只需要稍微在之前的基础上改动一下就可以了!看代码:void FindPath(BinaryTreeNode*pRoot, int nExpectedSum原创 2016-03-16 22:12:25 · 713 阅读 · 0 评论 -
简单选择排序
简单选择排序的思想:通过n-i次关键字间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1/************************************************************************//*简单选择排序 3 1 2 5 4 */原创 2016-03-05 20:57:23 · 739 阅读 · 0 评论 -
冒泡排序算法及其优化
正常的冒泡排序法:/************************************************************************//* 冒泡排序 *//******************************************原创 2016-03-03 19:02:06 · 826 阅读 · 0 评论 -
二叉树系列——路径系列:根节点到子节点的路径以及根节点到叶子节点的所有路径
思路:当用前序遍历的方式访问到某一个节点的时候,我们把该节点添加到路径中。如果该节点为叶子节点,则打印路径,如果当前节点不是叶节点,则继续访问它的子节点。当前节点访问结束之后,递归函数将自动回到它的父节点。因此我们在函数退出之前要在路径上删除当前节点,以确保返回父节点时路径刚好是从根节点到父节点的路径。下面是寻找某一特定叶子节点的代码:原创 2016-03-16 21:02:29 · 20290 阅读 · 5 评论 -
二叉树系列——路径系列:打印二叉树两个子节点之间的路径以及最低公共祖先
之前我们知道怎么求根节点到某一子节点的路径。同理,要求两个子节点之间的路径,我们可以分别求出根节点到子节点的路径,然后合并路径即可(这是最直观的,应该还有更简单的方法)!由于之前打印根节点到子节点的路径的函数返回后不能保存路径,所以修改如下,这样返回的path就保存了路径信息。//寻找某一个特定的子节点bool bLeafIsFound = false;//全局变量void f原创 2016-03-17 21:09:11 · 4472 阅读 · 2 评论 -
二叉树系列——二叉树中任意两个节点之间的最短路径
来源:https://segmentfault.com/a/1190000003465753题目:给定一棵二叉树的根节点和两个任意节点,返回这两个节点之间的最短路径思路:两个节点之间的最短路径一定会经过两个节点的最小公共祖先,所以我们可以用LCA(最低公共祖先)的解法。不同于LCA的是,我们返回不只是标记,而要返回从目标结点递归回当前节点的路径。当遇到最小公共祖先的时候便合转载 2016-03-17 21:56:30 · 16650 阅读 · 0 评论 -
数组最大子序列的和
/************************************************************************//* 求最大子序列的和,时间复杂度Q(N) *//**************************************************************原创 2016-04-21 22:39:03 · 906 阅读 · 0 评论