数据结构与算法
desmond_assis
给时光以生命,给岁月以积淀
展开
-
02. 算法复杂度(上)
文章目录1. 概念2.事后统计法3.大O复杂度表示法3.1 概述3.2 时间复杂度分析方法3.2.1 只关注循环执行次数最多的一段代码3.2.2 加法法则:总复杂度等于量级最大的那段代码的复杂度3.2.3 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积3.3 几种常见复杂度实例分析3.3.0 常用复杂度3.3.1 O(1)3.3.2 O(n)3.3.3 O(logn)3.3.4 O(nlo...原创 2018-12-13 22:33:19 · 154 阅读 · 0 评论 -
14.散列表(下)
文章目录1.用散列表+链表的方式,在复杂度为O(1)里实现LRU:1.1 一个缓存系统主要包含以下三个操作:2.总结3.思考1.用散列表+链表的方式,在复杂度为O(1)里实现LRU:LRU(Least Recently Used):维护一个固定大小的链表,如果缓存中存在当前元素,则删除并把它加入链表尾部。如果不存在,1)如果缓存已满(已达到链表最大长度),则删除头节点(最近最少用到的数据优先删...原创 2019-01-25 22:01:04 · 154 阅读 · 0 评论 -
12.散列表(上)
文章目录1.概念2.实现2.1 开放寻址法2.2 链表法1.概念 散列表用的是数组支持按照下标随机访问的特性,所以散列表其实就是数组的一种扩展,由数组演化而来 key: key. 散列函数(hash函数):把key转化为hash值的函数 散列值(hash值):数组的下标.hash = hash_function(key) 对hash函数的基本要求:散列函数计算得到的...原创 2019-01-20 19:30:24 · 140 阅读 · 0 评论 -
11.排序(下)
文章目录1.归并排序2.快速排序1.归并排序package com.desmond.codebase.algorithm.sorting;/** * 归并排序. * 采取分治思想。排序一个数组,先把数组从中间分成前后两部分, * 然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样,整个 * 数组就有序了。 * @author presleyli * @date 201...原创 2019-01-20 19:29:04 · 168 阅读 · 0 评论 -
08队列
文章目录1.概念2.分类2.1顺序队列2.1.1 不可变大小的队列2.1.2 可变大小的顺序队列2.1.3 利用固定长度,可变的顺序队列2.2链式队列2.3循环队列2.3.1 概念2.3.2 示意图2.3.3 代码3.应用3.1阻塞队列3.2并发队列3.3资源池1.概念先进者先出,是一种操作受限的线性结构,只有两种操作:入队enquque()和 出队dequeue().2.分类基于数组实现...原创 2019-01-08 22:50:21 · 160 阅读 · 0 评论 -
10.排序(上)
文章目录1. 如何分析一个排序算法1.1 排序算法的执行效率1.1 最好、最坏、平均情况时间复杂度1.2 时间复杂度的系数、常数、低阶1.3 比较和交换(移动)的次数1.2 排序算法的内存消耗1.3 排序算法的稳定性2. 冒泡排序2.1 思路2.2 代码2.3 算法分析2.3.1 是否原地排序2.3.2 是否稳定2.3.2 时间复杂度3. 插入排序3.1思路3.2代码3.3复杂度分析3.3.1 空...原创 2019-01-13 21:57:25 · 140 阅读 · 0 评论 -
13.散列表(中)
文章目录1. 如何设计散列函数1.1 散列函数设计不能太复杂1.2 散列函数生成的值要尽可能随机并且均匀分布2.装载因子过大怎么办3.如何避免低效地扩容4.如何选择冲突解决方法5.工业级散列表的特性&设计5.1 Java HashMap工业级链表实现5.1.1 初始大小5.1.2 装载因子和动态扩容5.1.3 散列冲突解决方法5.1.4 散列行数5.2 工业级散列表应该由哪些特性?5.3 ...原创 2019-01-23 21:17:24 · 176 阅读 · 0 评论 -
09.递归
文章目录1.递归三条件1.1 一个问题可分解为子问题1.2 分解完后,问题与子问题除了数据规模不一样,求解思路完全一样1.3 存在递归终止条件2.如何写递归代码2.1 将大问题化为小问题,写出地推公式,找到终止条件2.2 翻译成代码3.注意实现3.1 堆栈溢出3.2 重复计算1.递归三条件 周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现...原创 2019-01-10 22:13:50 · 115 阅读 · 0 评论 -
07栈
文章目录1.概念2.分类2.1顺序栈2.1.1 固定大小2.1.2 可扩容2.2链式栈3.应用3.1函数调用3.2表达式中的应用3.2.1 背景3.2.1 示意图3.3 括号匹配3.4 浏览器前进、后退4. Jvm中的栈1.概念栈是一种操作受限的线性表,只允许在一端插入和删除数据. 先进后出 and 后进先出个人感觉,栈可以使用 内部钱内部的场景,某个对象,在内部包含另一个完整的对象,比如 ...原创 2019-01-05 17:20:19 · 154 阅读 · 1 评论 -
06链表(下)
文章目录1) 单链表反转2) 链表中环的检测3) 两个有序的链表合并4) 删除链表倒数第n个结点5) 求链表的中间结点原创 2019-01-05 17:19:00 · 131 阅读 · 1 评论 -
05链表(上)
文章目录1.底层存储结构2.分类2.1 单链表2.1.1 概念2.1.1 时间复杂度2.2 双向链表2.2.1概念2.2.2 复杂度2.2.3 单链表、双向链表优劣2.3 循环链表3.性能:链表 V.S. 数组4.基于链表的LRU缓存淘汰算法4.1 思路4.2 实现4.3 复杂度分析4.4 引入hash结构降低复杂度5.基于数组的LRU缓存淘汰算法5.1 思路5.2 实现5.3 复杂度分析1.底...原创 2018-12-22 21:47:58 · 163 阅读 · 0 评论 -
01.概念
数据结构:就是指一组数据的存储结构算法:就是操作数据的一组方法数据结构是为算法服务的,算法要作用在特定的数据结构之上随机访问 v.s. 顺序访问随机访问是说你可以随意访问该数据结构中的任意一个节点,假设该数据结构有10个节点,你可以随意访问第1个到第10个节点。 对于列表而言,如果其存在10个节点,如果你要访问第5个节点,你只能从列表的头或者尾,依次遍历相邻的每一个节点;...原创 2018-12-10 22:44:00 · 116 阅读 · 0 评论 -
04数组
文章目录1.定义1.1概念1.2如何通过下标随访访问?2.数组插入3.数组删除4.容器与数组比较5.数组编号为啥从0开始5.1 原因15.2 原因21.定义1.1概念数组:是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。线性表:线性表就是数据排成像一条线一样的结构,每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表,队列,栈等也是线性结构。而与他...原创 2018-12-16 21:23:27 · 132 阅读 · 0 评论 -
03算法复杂度(下)
文章目录1.最好情况时间复杂度(best case time complexity)2.最坏情况时间复杂度(worst case time complexity)3.平均情况时间复杂度(average case time complexity)4.均摊时间复杂度(amortized time complexity)1.最好情况时间复杂度(best case time complexity)最好...原创 2018-12-15 22:42:29 · 172 阅读 · 0 评论 -
23.二叉树基础(一)
文章目录树基本概念高度深度层二叉树(Binary Tree)满二叉树完全二叉树存储二叉树链式存储: 基于链表顺序存储:基于数组比较二叉树的遍历前序遍历概念代码中序遍历概念代码后序遍历概念代码树如下图:基本概念 A 为 B 父节点, B为A的子节点 B,C,D父节点为同一个,他们成为兄弟节点 根节点:没有父节点的节点,比如E 叶子节点(叶节点):没有子节点的节点,比如GHIJ...原创 2019-03-07 23:05:10 · 231 阅读 · 0 评论