
数据结构
文章平均质量分 84
baidu-liuming
机器学习 深度学习 大数据 自然语言处理 linux python shell hive 算法
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
链栈初始化、进栈、出栈、判空、遍历、求长、求顶、清栈、毁栈
栈是限定仅在表尾进行插入或者删除的操作受限的线性表;表头端称为栈底,表尾端称为栈顶。#include "stdafx.h"#include "iostream"using namespace std;typedef int ElemType;typedef int Status;typedef struct SNode { ElemType data; struct SNode原创 2017-06-04 10:26:54 · 3160 阅读 · 1 评论 -
冒泡排序的三种实现
冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码:[cpp] view plain copy print?//冒转载 2017-06-13 21:20:08 · 328 阅读 · 0 评论 -
堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结转载 2017-06-14 16:49:55 · 278 阅读 · 0 评论 -
平衡二叉树,AVL树之图解篇
学习过了二叉查找树,想必大家有遇到一个问题。例如,将一个数组{1,2,3,4}依次插入树的时候,形成了图1的情况。有建立树与没建立树对于数据的增删查改已经没有了任何帮助,反而增添了维护的成本。而只有建立的树如图2,才能够最大地体现二叉树的优点。 在上述的例子中,图2就是一棵平衡二叉树。科学家们提出平衡二叉树,就是为了让树的查找性能转载 2017-07-30 22:53:07 · 680 阅读 · 0 评论 -
B-tree/B+tree/B*tree
B~树 1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树 (Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低转载 2017-07-31 15:05:27 · 340 阅读 · 0 评论 -
快速排序原理
快速排序是一种“分而治之”的思想,每次排序将当前序列最左边的元素设为哨兵,设置两个指针low和high,将两指针所指的元素分别和哨兵进行比较;将high指针指向的比哨兵小的元素,放在low的位置;将low指针指向的比哨兵大的元素放在high的位置。当low和high指向同一位置后,此位置即哨兵位置,将该位置赋予哨兵的值。然后以哨兵为界,将哨兵左侧的“一串”和哨兵右侧的“一串”递归执行上述过程。...原创 2018-03-24 15:54:34 · 467 阅读 · 0 评论 -
0 - 1背包问题 动态规划
0-1背包问题是一个很经典的问题,使用动态规划算法来求解也是很经典的。下面我用一个例子来讲解用动态规划算法求解0-1背包问题。 假设商店中有5件东西,重量用w表示,价格用v表示 w={1,2,3,4,5},v={1,4,2,8,9}w={1,2,3,4,5},v={1,4,2,8,9}w = \lbrace1, 2, 3, 4, 5\rbrace, v=\lbrace1, 4, 2, 8, ...原创 2018-04-07 16:20:06 · 408 阅读 · 0 评论 -
折半查找
折半查找是面试中经常考到的算法,折半查找默认被查找元素是有序的(若未有序,首先要进行排序),折半查找需要注意的有三点: 1. 设置mid; mid = low + (high - low)/2; 保证整个公式不超出其数据类型规定的范围;若设置成mid = (low + high)/2,则若此时low和high都较大,则low+high会超出相应数据类型的范围。 二分查找:public ...原创 2018-03-28 15:13:52 · 418 阅读 · 0 评论 -
n阶乘 动态规划版
暴力方法 public static int solve(int n) { if (n <= 1) { return 1; } return n * solve(n - 1); }暴力方法中含有大量的重复计算 自底向上 public static int solve(int n) ...原创 2018-04-04 16:51:18 · 1455 阅读 · 1 评论 -
棋盘-动态规划
题目请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从右下角走到左上角,总共有多少种走法,要求不能走回头路,即:只能往左和往上走,不能往右和往下走。思路将原文题化解为子问题,若每次只能走一步,即从第(M * N)个格走一步,只有两种走法,(N - 1, M)和(N, M - 1)。由此,可将原始问题拆解成子问题。边界条件...原创 2018-04-05 16:56:03 · 1681 阅读 · 0 评论 -
返回乱序数组中第k大的数
类似于快速排序,执行一次快速排序之后,每次只选择一部分继续执行快速排序,直到找到第K大个元素为止,这个元素在数组位置后面的元素即为所求。时间复杂度:O(n)public class Quick_find { public static int sort(int[] array,int low,int high){ if (low>high) ...原创 2018-05-08 12:05:33 · 979 阅读 · 0 评论 -
求数组中最长递增子序列
写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。例如: arr[] = {1, -1, 2, -3, 4, -5, 6, -7},其最长递增子序列的长度为4 如(1, 2, 4, 6)其中最长递增子序列是不连续的。解法:根据无后效性的定义,各阶段按照一定的次序排列好之后,对于某个给定阶段的状态来说,它以前各个阶段的状态无法直接影响它未来的决策,而只能间接地...原创 2018-06-02 21:32:16 · 2272 阅读 · 0 评论 -
对长度为N的数组,值大小为(1, N)且无重复数字的数组进行排序
循环遍历数组,判断arr[i] == i + 1,是否成立。若不成立,则交换 arr[i] 和arr[arr[i] - 1];若成立,则继续遍历下一个 public void swap(int[] arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; ...原创 2018-06-02 21:47:39 · 1146 阅读 · 0 评论 -
求两个已排序数组的交集
问题描述求两个已排序数组的交集和并集,要求时间复杂度为O(m + n)解题思路求两个数组的交集 使用两个指针分别指向数组A和数组B,指向数字较小的指针向前移动,若遇到两个数组具有相同的数字,则进行保存,直到其中任何一个数组遍历完 public Stack<Integer> findCommonNum(int[] arr1, int[] arr2){ ...原创 2018-06-02 11:29:30 · 1179 阅读 · 0 评论 -
直接插入排序,折半插入排序
一、基本概念 1.1:排序:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列 1.2:内部排序:待排序记录全部存放在内存中进行排序过程。 1.3:外部排序:待排序记录数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需外存进行辅助存储的排序过程。 1.4:按照排序过程中所依据的原则不同,内部排序可分为五类:原创 2017-06-12 10:28:00 · 626 阅读 · 0 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的转载 2017-06-13 16:52:02 · 319 阅读 · 0 评论 -
白话经典算法系列之三 希尔排序的实现
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔转载 2017-06-13 16:50:04 · 395 阅读 · 0 评论 -
顺序栈的初始化,进栈、出栈、求长、判空、访顶、遍历、清空、销毁
顺序栈即栈的顺序存储结构,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,是一种后进先出(last in first out,LIFO)的线性表。 判断栈不存在的条件为:S.base=NULL; 空栈:S.base=S.top; 满栈:S.top-S.base=S.stacksize; #include "stdafx.h" #include原创 2017-06-04 10:00:46 · 13694 阅读 · 2 评论 -
链队列和循环队列的表示与实现-初始化、判空、求长、入队、出队、遍历、求头、求尾、清队、毁队
队列:队列是一种先进先出(first in first out,FIFO)的线性表。它只允许在一端进行插入,而在另一端进行删除的元素。在队列中允许插入的元素叫做队尾,允许删除的一端叫做队头。其结构如下: 1、链队列-----队列的链式表示与实现 链队列:用链表表示的队列; 一个链队列需要两个分别指示队头和队尾的指针(头指针和尾指针)才能唯一确定。原创 2017-06-04 14:16:50 · 4784 阅读 · 0 评论 -
树和二叉树基本概念以及二叉树遍历
一、 树 树是具有层次结构的n(n>0)个结点的有限集。 树的结点包含一个数据元素及若干指向其子树的分支。 结点的度:结点拥有子树的数量;A的度为3,K的度为0。 叶子结点(终端结点):度为0的结点;K、L、F、G、M、I、J为叶子结点。 分支结点(非终端结点):度不为0的结点。A、B、C、D、E、H为分支结点。原创 2017-06-05 14:42:29 · 501 阅读 · 0 评论 -
线性表初始化、判空、插入、删除、遍历、修改、查值、合并
#include "stdafx.h"#include using namespace std;typedef int ElemType;typedef int Status;#define INIT_LIST_SIZE 100#define LIST_INCREMENT 10struct Linear { ElemType *elem; //指向基地址,未赋值时其为NULL原创 2017-06-05 11:00:41 · 2135 阅读 · 0 评论 -
堆排序
堆排序的时间复杂度为:O(nlogn)#include "stdafx.h"#include #includeusing namespace std;void heapAdjust(int a[], int i, int len) { int lchild = 2 * i; int rchild = 2 * i + 1; int max = i; if (i<=len/2)原创 2017-06-20 14:35:36 · 231 阅读 · 0 评论 -
静态查找:顺序查找和折半查找法
一、静态查找: 只是起查询或检索的作用,不涉及插入、删除,反之为动态查找。二、顺序查找 顺序查找过程中往往设置监视哨,在查找过程中不用每一步都检查整个表是否查找完毕。 假设,每个元素的查找概率相同,顺序查找成功时平均查找长度为:(n+1)/2;顺序查找不成功时平均查找长度为:(n+1)/4。 考虑到查找不成功的情况,顺序查找表的平均查找长度为:3(n+1)原创 2017-06-09 15:18:18 · 3828 阅读 · 0 评论 -
动态查找表之二叉排序树的查找、遍历、删除
一、动态查找表 静态查找表只是对表中元素进行检索,返回成功或不成功! 动态查找表的表结构是在查找的过程中动态生成的。若表中存在关键字等于给定的值key的记录,则返回成功;否则,插入关键字等于key的记录。二、二叉排序树 二叉排序树(BST)特点结点值的大小遵循“左”的排序,其中序遍历顺序必是严格递增的。 2.1 根据给定的数组按照“左”原创 2017-06-09 16:43:14 · 1393 阅读 · 0 评论 -
快速排序 快速搞定
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定转载 2017-06-14 09:33:37 · 332 阅读 · 0 评论 -
冒泡排序和快速排序
快速排序同白话文文章,现将完整代码贴出:冒泡排序:#include "iostream"using namespace std;//获取数组长度template int getArrayLength(T &array) { return sizeof(array) / sizeof(array[0]);}//输出void output(int a[], int len)原创 2017-07-01 09:22:15 · 274 阅读 · 0 评论 -
单向循环链表创建、遍历、插入、删除、查找(按位置,按元素值)、清空、销毁
SinglyLinkedCirculayList.h#include "stdafx.h"#include "iostream"using namespace std;typedef struct LNode { int data; struct LNode *next;}LNode, *LinkedList;//创建链表bool createLinkedList(Linked原创 2017-06-11 10:16:44 · 11438 阅读 · 2 评论 -
单向链表的创建、遍历、求长、判存、判空、插入、删除、查找(按位置或元素)、合并
linkedlist.h#include "stdafx.h"#include "iostream"using namespace std;typedef struct LNode { int data; struct LNode *next;}*LinkedList; //用LNode, LinkList代替typedef struct LNode;void Create_原创 2017-06-11 09:15:30 · 506 阅读 · 0 评论 -
双向链表的创建、打印、求长、插入、删除、查值、清空、销毁
删除双向链表中的最后一个结点需单独对待doublyLinkedList.h#include "iostream"using namespace std;typedef struct DuLNode { int data; struct DuLNode *prior; struct DuLNode *next;}DuLNode, *DuLinkedList;//创建链表bo原创 2017-06-11 11:19:36 · 882 阅读 · 0 评论 -
双向循环链表的创建、插入、删除、求长、查询、打印、修改、清空、销毁
doublyLinkedCircularList.h#include "iostream"using namespace std;typedef struct DuLNode { int data; struct DuLNode *prior, *next;}DuLNode, *DuLinkedCirList;bool createDuLinkedCirList(DuLinkedC原创 2017-06-11 11:46:22 · 746 阅读 · 0 评论 -
Trie
Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。 典型应用是用于统计和排序大量的字符串(但不仅限于字符串), 所以经常被搜索引擎系统用于文本词频统计。字典树(Trie)可以保存一些字符串->值的对应关系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不过 Trie 的 key 只能是字符串。Trie 的强大之处就在于它的时间...转载 2019-04-23 14:26:21 · 370 阅读 · 0 评论