跳至主要內容
十大经典排序算法总结

本文转自:http://www.guoyaohua.com/sorting.html,JavaGuide 对其做了补充完善。

引言

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。


JavaGuidePro大约 22 分钟计算机基础算法
几道常见的链表算法题

1. 两数相加

题目描述

Leetcode:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

JavaGuidePro大约 7 分钟计算机基础算法
几道常见的字符串算法题

作者:wwwxmu

原文地址:https://www.weiweiblog.cn/13string/

1. KMP 算法

谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字符串查找的问题,可以在一个字符串(S)中查找一个子串(W)出现的位置。KMP 算法把字符匹配的时间复杂度缩小到 O(m+n) ,而空间复杂度也只有 O(m)。因为“暴力搜索”的方法会反复回溯主串,导致效率低下,而 KMP 算法可以利用已经部分匹配这个有效信息,保持主串上的指针不回溯,通过修改子串的指针,让模式串尽量地移动到有效的位置。


JavaGuidePro大约 9 分钟计算机基础算法
剑指offer部分编程题

斐波那契数列

题目描述:

大家都知道斐波那契数列,现在要求输入一个整数 n,请你输出斐波那契数列的第 n 项。
n<=39

问题分析:

可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有一个很大的问题,那就是递归大量的重复计算会导致内存溢出。另外可以使用迭代法,用 fn1 和 fn2 保存计算过程中的结果,并复用起来。下面我会把两个方法示例代码都给出来并给出两个方法的运行时间对比。

示例代码:


JavaGuidePro大约 16 分钟计算机基础算法
布隆过滤器

布隆过滤器相信大家没用过的话,也已经听过了。

布隆过滤器主要是为了解决海量数据的存在性问题。对于海量数据中判定某个数据是否存在且容忍轻微误差这一场景(比如缓存穿透、海量数据去重)来说,非常适合。

文章内容概览:

  1. 什么是布隆过滤器?
  2. 布隆过滤器的原理介绍。
  3. 布隆过滤器使用场景。
  4. 通过 Java 编程手动实现布隆过滤器。
  5. 利用 Google 开源的 Guava 中自带的布隆过滤器。
  6. Redis 中的布隆过滤器。

什么是布隆过滤器?


JavaGuidePro大约 10 分钟计算机基础数据结构

图是一种较为复杂的非线性结构。 为啥说其较为复杂呢?

根据前面的内容,我们知道:

  • 线性数据结构的元素满足唯一的线性关系,每个元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继。
  • 树形数据结构的元素之间有着明显的层次关系。

但是,图形结构的元素之间的关系是任意的。

何为图呢? 简单来说,图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。


JavaGuidePro大约 6 分钟计算机基础数据结构

什么是堆

堆是一种满足以下条件的树:

堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。

大家可以把堆(最大堆)理解为一个公司,这个公司很公平,谁能力强谁就当老大,不存在弱的人当老大,老大手底下的人一定不会比他强。这样有助于理解后续堆的操作。

!!!特别提示:

  • 很多博客说堆是完全二叉树,其实并非如此,堆不一定是完全二叉树,只是为了方便存储和索引,我们通常用完全二叉树的形式来表示堆,事实上,广为人知的斐波那契堆和二项堆就不是完全二叉树,它们甚至都不是二叉树。
  • 二叉)堆是一个数组,它可以被看成是一个 近似的完全二叉树。——《算法导论》第三版

JavaGuidePro大约 9 分钟计算机基础数据结构
线性数据结构

1. 数组

数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。

我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。

数组的特点是:提供随机访问 并且容量有限。

假如数组的长度为 n。
访问:O1//访问特定位置的元素
插入:O(n )//最坏的情况发生在插入发生在数组的首部并需要移动所有元素时
删除:O(n)//最坏的情况发生在删除数组的开头发生并需要移动第一元素后面所有的元素时

JavaGuidePro大约 12 分钟计算机基础数据结构
红黑树

红黑树

红黑树特点 :

  1. 每个节点非红即黑;
  2. 根节点总是黑色的;
  3. 每个叶子节点都是黑色的空节点(NIL 节点);
  4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
  5. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。

红黑树的应用:TreeMap、TreeSet 以及 JDK1.8 的 HashMap 底层都用到了红黑树。

为什么要用红黑树? 简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。详细了解可以查看 漫画:什么是红黑树?(也介绍到了二叉查找树,非常推荐)


JavaGuidePro小于 1 分钟计算机基础数据结构

树就是一种类似现实生活中的树的数据结构(倒置的树)。任何一颗非空树只有一个根节点。

一棵树具有以下特点:

  1. 一棵树中的任意两个结点有且仅有唯一的一条路径连通。
  2. 一棵树如果有 n 个结点,那么它一定恰好有 n-1 条边。
  3. 一棵树不包含回路。

下图就是一颗树,并且是一颗二叉树。

二叉树
二叉树

JavaGuidePro大约 7 分钟计算机基础数据结构
2
3