常用的数据结构与算法
数据结构和算法是一名开发人员的重要的基本功,希望通过本专栏记录下我学习过的数据结构和算法,同时记录我思考的过程,能对有同样学习需求的人带来一点帮助!
Zach_ZSZ
IT攻城狮,喜爱研究技术,希望通过不断的学习,将来能更多的分享技术,更好的使用技术。
展开
-
二分法查找
如何用最省内存的方式实现快速查找功能二分法思想二分法查找针对的是一个有序的数据集合,每次通过与区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0二分查找非常高效,假设数据大小是n,每次查找后数据都会缩小为原来的一半,也就是会除以2,最坏情况下,直到查找区间被缩小为空,才停止当n/2k = 1时,k是总共缩小的次数,而每一次缩小操作...原创 2019-08-04 16:55:11 · 26837 阅读 · 5 评论 -
线性排序:如何根据年龄给100万用户数据排序
桶排序,计数排序,基数排序的时间复杂度是线性关系,因为三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作,故可做到线性的 时间复杂度桶排序核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据在单独进行排序,桶内排完之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了如果要排序的数据有n个,均匀的划分到m个桶内,每个桶内就有k=n/m个元素,每个桶内部...2019-07-28 16:31:29 · 342 阅读 · 0 评论 -
排序(下)
排序(下): 如何用快排思想在O(n)内查找第K大元素?冒泡排序,插入排序选择排序的时间复杂度都是O(n2 ),比较高,适合小规模数据排序,而归并排序和快速排序,时间复杂度都是O(nlogn)的排序,适合大规模的数据排序归并排序如果要排序一个数组,先把数组从 中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就是有序的归并排序使用的 ...原创 2019-07-21 23:24:41 · 204 阅读 · 0 评论 -
排序(上)
如何分析一个排序算法的效率: 最好情况,最坏情况,平均情况时间复杂度 时间复杂度的系数,常数,低阶 比较次数和交换(移动)次数 排序算法的稳定性如果待排序的序列中存在值相等的元素,经过排序之后,相等的元素之间原有的先后顺序不变,则为稳定的排序算法,反之则为不稳定的排序算法排序算法的内存消耗原地排序(Sorted in place) 原地排序算法特指空间复杂...原创 2019-07-21 23:02:02 · 121 阅读 · 0 评论 -
什么是栈
栈是一种后进先出,先进后出的数据结构,只允许一端插入和删除数据,在特定的应用场景下 ,当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出,先进后出的特性,就应用选择栈实现栈的实现:栈既可以用数组来实现,也可以用链表实现,分别为顺序栈和链式栈;栈的数组实现package com.zach.geekbang.datastructure.stack;/** * 栈的数...原创 2019-07-07 22:35:16 · 324 阅读 · 0 评论 -
队列
队列队列是一种先进先出的数据结构,基本操作就是入队,放一个数据到队列尾部;出队,从队列头部取一个元素. 队列与栈一样,也是一种操作受限的线性表数据结构;栈与队列顺序队列与链式队列队列可以使用数组实现,也可以使用链表实现,用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列数组的实现方式:// 用数组实现的队列public class ArrayQueue { // 数组:ite...原创 2019-06-23 22:45:29 · 118 阅读 · 0 评论 -
链表
数组需要一块连续的内存空间来存储,而链表不需要一块连续的内存空阿金,通过指针将一组零散的内存块串联起来,数组对内存的要求较高,如果申请一个100MB大小的数组,内存中没有连续的,足够大的存储空间时,即便内存的剩余总可用空间大于100MB,仍然会申请失败,而申请100MB大小的链表,则不会有问题单链表将内存块称为链表的结点,每个结点除了存储数据之外,还需要记录链上的下一个结点的地址,...原创 2019-09-01 11:33:51 · 153 阅读 · 0 评论 -
二叉树基础
树(Tree)树中每个元素叫作节点;用来连线相邻节点之间的关系,即"父子关系";把没有父节点的节点叫作根节点,没有子节点的节点叫作叶子节点或叶节点;树中高度(Height),深度(Depth),层(Level)的定义:节点高度=节点到叶子节点的最长路径(边数)节点的深度=根节点到这个节点所经历的边的个数节点的层数=节点深度+1树的高度=根节点的高度高度类比生活...原创 2019-09-15 17:15:53 · 255 阅读 · 0 评论