在线编制程序面试,会渐渐翻新到博客中

不论明日的Computer技能生成,新工夫的产出,全体都是来自数据结构与算法基础。我们须要温故而知新。

目录
在线演练
在线编制程序面试
数据结构
算法
野心勃勃算法
位运算
复杂度分析
录制教程
面试宝典
Computer科学信息
文件结构

*未产生版,在念书进程中,会日趋翻新到博客中~>_<~

      
算法、架构、战术、机器学习时期的涉及。在过往和本事职员沟通时,很两人对算法和框架结构之间的关系认为不足精晓,算法是软的,架构是硬的,难道算法和架构还也有怎么着关系不成?其实否则,算法和架构的关系特别紧密。在网络时期,大家须要用算法管理的数据规模进一步大,供给的拍卖时间更加短,单一Computer的管理技术是不容许满意供给的。而架构手艺的前进,带来了累累不一风味的布满式计算平台。算法为了能够使用到那一个遍及式总计平台上,往往须求向上,举个例子:并行计算需求算法能够拆分为可并行总计的多少个单身单位,但为数十分多算法不抱有这种可拆分特性,使得不可能简单通过分布式计算来进步功效。那时候,为了促成遍及式化的图谋成效,要求将算法举办等效改写,使得其有着独立拆分性。另一方面,算法的提升,也扭转会对计量框架结构提议新的渴求。

在线演练
LeetCode
Virtual Judge
CareerCup
HackerRank
CodeFights
Kattis
HackerEarth
Codility
Code Forces
Code Chef
Sphere Online Judge –
SPOJ

自学资料一大半为挑选出来大致易懂的博客,希望能支持到算法入门者o(≧v≦)o~~

      
对算法和战术的关系亦是,然而那三个概念并不像算法和架构那样好解释。战术是解决实际难点的花招,而算法是不留余地一类难题的艺术。消除叁个切实难点,恐怕须要将难点解释为叁个照旧五个算法,一齐效果来消除,也说不定不须求算法。例如,对于性格化信息,大家大概有一个国策是:重大新闻须要立时显示给用户;而落实的切切实实算法也许只包罗“重大新闻开采算法”等。

在线编程面试
Gainlo
Refdash

 

     
机器学习是一类算法的统称,在自然的数目集结上,利用机械学习的算法,自动得到规律,来开展前瞻,机器学习世界分布的主题素材回顾分类难题、回归难题等。而估摸,越发是对用户的溺爱进行前瞻是引入领域的骨干难题之一,机器学习算法在消除此类难点上会爆发比一点都不小的效果。

数据结构
链表
链表是一种由节点(Node)组成的线性数据集结,每一个节点通过指针指向下二个节点。它是一种由节点组成,并能用于表示类别的数据结构。
单链表 :各个节点仅针对下叁个节点,最终一个节点指向空(null)。
双链表
:各样节点有多个指针p,n。p指向前一个节点,n指向下多少个节点;最终一个节点指向空。
循环链表 :各类节点指向下三个节点,最终三个节点指向第八个节点。
日子复杂度:索引:O(n)
查找:O(n)
插入:O(1)
删除:O(1)

一、大纲

  • 从没有过最佳的算法,唯有合适的算法。推荐算法和成品需要、应用场景、数据密切相关,不要相信有哪些包打天下的算法;
  • 数量是基础:数据充足而且品质高,轻便算法也得以有不易的魔法;反之,则多好的算法也不也会有好的机能;
  • 木桶效应:算法战略要和用户供给、功用呈现密切合营;(注:木桶原理又称短板理论,其宗旨内容为“贰头木桶盛水的有个别,并不在于桶壁上高高的的那块木块,而刚刚取决于桶壁上最短的那块。”)
  • 诚如来讲,推荐算法都须求思量是还是不是能管理大数目,是还是不是能广泛并行化。


栈是一个成分群集,扶助五个基本操作:push用于将成分压入栈,pop用于删除栈顶成分。
后进先出的数据结构(Last In First Out, LIFO)
日子复杂度索引:O(n)
查找:O(n)
插入:O(1)
删除:O(1)

图片 1

 

队列
队列是一个成分集结,帮衬三种基本操作:enqueue
用于加多几个因素到行列,dequeue 用于删除队列中的二个要素。
先进先出的数据结构(First In First Out, FIFO)。
岁月复杂度索引:O(n)
查找:O(n)
插入:O(1)
删除:O(1)

图片 2

正文


树是无向、联通的无环图。

 

一、数据结构基础

二叉树
二叉树是八个树形数据结构,每种节点最多能够有多少个子节点,称为左子节点和右子节点。
满二叉树(Full Tree) :二叉树中的每个节点有 0 可能 2 个子节点。

博客董西城Vamei

数组

大数据

思想导图下载地址http://pan.baidu.com/s/1gdCqW8r

定义

一应俱全二叉树(Perfect Binary)
:二叉树中的每一种节点有四个子节点,并且有所的卡片节点的深度是完全一样的。
一同二叉树
:二叉树中除最终一层外别的各层的节点数平均高度达最大值,最后一层的节点都接连集中在最左侧。

 

  • 按顺序三番五次存款和储蓄数据成分,常常索引从0伊始
  • 以集结论中的元组为底蕴
  • 数组是最古老,最常用的数据结构

二叉查找树
二叉查找树(BST)是一种二叉树。其任何节点的值都大于等于左子树中的值,小于等于右子树中的值。
日子复杂度索引:O(log(n))
查找:O(log(n))
插入:O(log(n))
删除:O(log(n))


知识要点

大数据

二、数据结构资料推荐

  • 目录最优;不便于查找、插入和删除(除非在数组最末举办)
  • 最基础的是线性数组或一维数组
    数CEO度固定,意味着注脚数组时应指明长度
  • 动态数组与一维数组看似,但为额外增多的因素预留了半空中
    一旦动态数组已满,则把每一成分复制到越来越大的数组中
  • 好像网格或嵌套数组,二维数组有 x 和 y 索引

字典树
字典树,又称作基数树或前缀树,是一种用于存储键值为字符串的动态集合或涉及数组的查究树。树中的节点并不间接存款和储蓄关联键值,而是该节点在树中的地点决定了其关系键值。一个节点的全体子节点都有平等的前缀,根节点则是空字符串。


岁月复杂度

大数据

数组:查找快O(1),插入删除慢O(n)

  • O(1)索引:一维数组:O(1),动态数组:O(1)
  • O(n)物色:一维数组:O(n),动态数组:O(n)
  • O(log n)最优查找:一维数组:O(log n),动态数组:O(log n)
  • O(n)插队:一维数组:n/a,动态数组:O(n)

树状数组
树状数组,又叫做二进制索引树(Binary Indexed
Tree,BIT),其定义上是树,但以数组达成。数组中的下标代表树中的节点,各种节点的父节点或子节点的下标能够因而位运算获得。数组中的各种成分都蕴涵了预测算的区间值之和,在全部树更新的经过中,这一个总括的值也一模二样会被更新。
时间复杂度区间求和:O(log(n))
更新:O(log(n))

链表:查找慢O(n),插入删除快O(1)

链表

大数据

块状链表:查找插入删除O(sqrt(n));数组+链表;

定义

线段树
线段树是用来存储区间和线条的树形数据结构。它同意查找二个节点在多少条线段中出现的次数。
日子复杂度区间查找:O(log(n))
更新:O(log(n))

图片 3

  • 结点存储数据,并针对性下一结点
    最基础的结点包涵二个数码和四个指针(指向另一结点)

    • 链表靠结点中针对下一结点的指针连接成链

大数据

队列:先进先出

要点


堆是一种基于树的满意某个特征的数据结构:整个堆中的全体父亲和儿子节点的键值都满意一样的排序条件。堆分为最大堆和微小堆。在最大堆中,父节点的键值长久大于等于全部子节点的键值,根节点的键值是最大的。最小堆中,父节点的键值长久小于等于全数子节点的键值,根节点的键值是非常小的。
时光复杂度索引:O(log(n))
查找:O(log(n))
插入:O(log(n))
删除:O(log(n))
删去最大值/最小值:O(1)

堆栈:先进后出

  • 为优化插入和删除而设计,但不实惠索引和查究
  • 双向链表包括指向前一结点的指针
  • 循环链表是一种终端结点指针域指向头结点的粗略链表
  • 酒馆平日由链表完毕,但是也得以应用数组实现
    货仓是“后进先出”(LIFO)的数据结构

    • 由链表达成时,只有头结点处能够拓展插队或删除操作
  • 一律地,队列也得以透过链表或数组完结
    队列是“先进先出”(FIFO)的数据结构

    • 由双向链表达成时,只可以在头顶删除,在前边插入

大数据

双端队列:队列与货仓结合,有head与tail的数组,队首队尾都能够增加和删除。

时光复杂度

哈希
哈希用于将轻便长度的多寡映射到定点长度的数据。哈希函数的重回值被称为哈希值、哈希码大概哈希。纵然不一致的主键得到一致的哈希值,则发出了争执。
Hash Maphash map 是二个积存键值间事关的数据结构。HashMap
通过哈希函数将键转化为桶大概槽中的下标,从而有利于钦命值的寻找。
顶牛消除链地址法( Separate Chaining
:在链地址法中,各样桶(bucket)是互为独立的,每贰个索引对应贰个要素列表。管理HashMap
的年华就是查究桶的大运(常量)与遍历列表成分的大运之和。
开放地址法( Open Addressing
:在开放地方方法中,当插入新值时,会咬定该值对应的哈希桶是还是不是留存,假诺存在则依照某种算法依次选拔下三个恐怕的任务,直到找到贰个未被占领的地点。开放地点即有些元素的地方并十分短久由其哈希值决定。

图片 4

  • O(n)索引:链表:O(n)
  • O(n)查找:链表:O(n)
  • Linked Lists: O(n)最优查找:链表:O(n)
  • O(1)插入:链表:O(1)

大数据

哈希表

哈希表或哈筹算


图是G =(V,E)的雷打不动对,其包含终端或节点的集结 V
以及边或弧的集结E,当中E包蕴了多少个出自V的因素(即边与两个极点相关联
,并且该关联为这两极分化的冬季对)。
无向图 :图的邻接矩阵是对称的,由此如果存在节点 u 到节点 v
的边,那节点 v 到节点 u 的边也毫无疑问存在。
有向图 :图的邻接矩阵不是对称的。因而一旦存在节点 u 到节点 v
的边并不代表一定期存款在节点 v 到节点 u 的边。

  • 集合A到集合B的映射;
  • 哈希函数:MD5, SHA;
  • 采取:文件相比较,密码存款和储蓄;
  • 撞倒消除:open hashing -> 链表;closed hashing ->
    数组下标移动到空位(rehashing移动到越来越大的新数组) hash
    table

定义

大数据

Bit-Map:三个bit代表二个数字,比方10bit方可表示1~10
bitmap

  • 经过键值对开始展览仓库储存
  • 哈希函数接受一个首要字,并回到该重大字唯一对应的输出值
    这一历程称为散列(hashing),是输入与输出一一对应的定义

    • 哈希函数为该数据重临在内部存款和储蓄器中独步天下的贮存地点

算法
排序
飞速排序
稳定:否
时刻复杂度最优:O(nlog(n))
最差:O(n^2)
平均:O(nlog(n))

二叉堆/堆:高度为(lg^2)n,数组
资料2

要点

大数据

细微堆:每个父节点均比子节点小

  • 为寻觅、插入和删除而陈设
  • 哈希冲突是指哈希函数对五个差异的多寡项爆发了扳平的输出值
    持有的哈希函数都存在这么些主题材料

    • 用三个可怜大的哈希表,能够有效消除这一主题材料
    • 哈希表对于涉嫌数组和数据库检索拾叁分主要

群集排序
统一排序是一种分治算法。这些算法不断地将三个数组分为两片段,分别对左子数组和右子数组排序,然后将四个数组合併为新的雷打不动数组。
稳定:是
时光复杂度:最优:O(nlog(n))
最差:O(nlog(n))
平均:O(nlog(n))

图片 5

时间复杂度

桶排序
桶排序是一种将成分分到一定数额的桶中的排序算法。每种桶里面使用别的算法排序,或递归调用桶排序。
时刻复杂度最优:Ω(n + k)
最差: O(n^2)
平均:Θ(n + k)

图片 6

  • O(1)索引:哈希表:O(1)
  • O(1)查找:哈希表:O(1)
  • O(1)插入:哈希表:O(1)

大数据

 

二叉树

基数排序
基数排序类似于桶排序,将成分分发到一定数额的桶中。不一样的是,基数排序在细分元素之后未有让种种桶单独开始展览排序,而是直接做了合併操作。
时间复杂度最优:Ω(nk)
最差: O(nk)
平均:Θ(nk)

字典树(前缀树):适合用来字符串检索、字符串最长公共前缀、按字典排序
资料

定义

图算法
纵深优先 搜索
纵深优先搜索是一种先遍历子节点而不回看的图遍历算法。
岁月复杂度:O(|V| + |E|)

布署、查找O(N):N为字符串长度,空间O(26^n)

  • 一种树形的数据结构,每一结点最多有四个子树
    • 子结点又分为左子结点和右子结点

大数据

图片 7图片 8

要点

广度优先 搜索
广度优先寻找是一种先遍历邻居节点而不是子节点的图遍历算法。
日子复杂度:O(|V| + |E|)

后缀树:适合复杂的字符串操作

  • 为优化查找和排序而规划
  • 落后树是一种不平衡的树,借使完全只有二只,其本质正是二个链表
  • 对照于其余数据结构,二叉树较为轻便达成
  • 可用于达成二叉查找树
    • 二叉树利用可正如的键值来明确子结点的趋向
    • 左子树有比大人结点越来越小的键值
    • 右子树有比父母结点越来越大的键值
    • 重新的结点可粗略
    • 出于上述原因,二叉查找树日常被视作一种数据结构,而不是二叉树

大数据

后缀树组:适合复杂的字符串操作

岁月复杂度

拓扑排序
拓扑排序是有向图节点的线性排序。对于其它一条节点 u 到节点 v 的边,u
的下标先于 v。
时间复杂度:O(|V| + |E|)

二叉查找树:增加和删除查的复杂度等于深度,深度最多为n,最少为log(n)

  • 目录:二叉查找树:O(log n)
  • 找出:二叉查找树:O(log n)
  • 插入:二叉查找树:O(log n)

Dijkstra算法
Dijkstra 算法是一种在有向图中检索单源最短路线的算法。
时间复杂度:O(|V|^2)

数列有序,将会走下坡路成为线性表,即独苗的时候。

二、寻觅基础

大数据

删除操作时一旦剔除节点相同的时间有左右节点,使用删除节点的左子树的最大值或右子树的细微值替换。

广度优先寻觅

Bellman-Ford算法
*Bellman-Ford *
是一种在带权图中找找单一源点到别的节点最短路线的算法。
虽说日子复杂度大于 Dijkstra 算法,但它能够拍卖包涵了负值边的图。
岁月复杂度:最优:O(|E|)
最差:O(|V||E|)

图片 9图片 10

定义

大数据

图片 11

  • 一种在树(或图)中张开寻觅的算法,从根结点开始,优先遵照树的层系开始展览查找
    • 探求同一层中的各结点,平常从左往右进行
    • 拓展检索时,同期追踪当前层中结点的子结点
    • 时下一层寻找达成后,转入遍历下一层中最左边的结点
    • 最下层最右端是最末结点(即该结点深度最大,且在现阶段档期的顺序的最右端)

Floyd-Warshall 算法
*Floyd-Warshall *
算法是一种在无环带权图中追寻自便节点间最短路线的算法。
该算法实施一次就能够找到全数节点间的最短路线(路径权重和)。
日子复杂度:最优:O(|V|^3)
最差:O(|V|^3)
平均:O(|V|^3)

B树:品质总等于二分法,未有平衡难点。

要点

最小生成树算法
最小生成树算法是一种在无向带权图中找出最小生成树的贪婪算法。换言之,最小生成树算法能在一个图中找到连接全数节点的边的最小子集。
时光复杂度:O(|V|^2)

图片 12

  • 当树的增加率超过深度时,该找寻算法较优
  • 进展树的遍历时,使用队列存储树的音信
    • 缘由是:使用队列比深度优先寻觅更为内存密集
    • 由于需求仓库储存指针,队列须要占用更加多内部存款和储蓄器

Kruskal 算法
*Kruskal * 算法也是四个计算最小生成树的贪心算法,但在 Kruskal
算法中,图不自然是过渡的。
时光复杂度:O(|E|log|V|)

B+树:适合文件索引系统,只在叶子结点命中

光阴复杂度

贪得无厌算法
贪心算法总是做出在近期看来最优的选料,并期待最终全体也是最优的。
行使贪心算法能够消除的主题材料无法不具有如下二种特色:最优子结构难题的最优解包涵其子难题的最优解。

图片 13

  • O(|E| + |V|)查找:广度优先寻觅:O(|E| + |V|)
  • E 是边的数目
  • V 是终极的数码

贪心不足选取每一步的贪心选用能够获得难题的一体化最优解。

B*树:在B+树基础上扩大兄弟节点指针,扩展空间利用率

深度优先找寻

实例-硬币选取主题材料
加以期望的硬币总和为 V 分,以及 n 种硬币,即类型是 i 的硬币共有
coinValue[i] 分,i的界定是 [0…n –
1]。就算每连串型的硬币都有极端个,求解为使和为 V 分最少须要有个别硬币?
硬币:便士(1美分),镍(5美分),一角(10美分),五分之二(25美分)。
假使总和 V 为41,。我们能够运用贪心算法查找小于或然等于 V
的面值最大的硬币,然后从 V 中减掉该硬币的值,如此重复举行。V = 41 |
使用了0个硬币
V = 16 | 使用了1个硬币(41 – 25 = 16)
V = 6 | 使用了2个硬币(16 – 10 = 6)
V = 1 | 使用了3个硬币(6 – 5 = 1)
V = 0 | 使用了4个硬币(1 – 1 = 0)

图片 14

定义

运算
位运算即在比特等第进行操作的才干。使用位运算才干能够推动越来越快的运维速度与越来越小的内部存款和储蓄器使用。
测试第 k 位:s & (1 << k);
设置第k位:s |= (1 << k);
关闭第k位:s &= ~(1 << k);
切换第k位:s ^= (1 << k);
乘以2n:s << n;
除以2n:s >> n;
交集:s & t;
并集:s | t;
减法:s & ~t;
领取最小非0位:s & (-s);
领取最小0位:~s & (s + 1);
交换值:x ^= y; y ^= x; x ^= y;

 

  • 一种在树(或图)中开始展览搜寻的算法,从根结点开头,优先遵照树的深浅开始展览检索
    • 从左侧开头一贯往下遍历树的结点,直到不能够承接这一操作
    • 假诺达到某一拨出的最前面,将赶回上一结点并遍历该支行的右子结点,如果得以将从左往右遍历子结点
    • 现阶段这一拨出寻找完毕后,转入根节点的右子结点,然后不断遍历左子节点,直到达到最底端
    • 最右的结点是最末结点(即怀有祖先中最右的结点)

运维时分析
大 O 表示
大 O 表示用于表示某些算法的上界,用于描述最坏的场所。

AVL:平衡二叉树、深度为O(lgn)、子树深度相差不超过1、单旋转与双旋转
资料

要点

大数据

小小的深度Math.ceil( log(2)(N+1) )

  • 当树的吃水抢先宽度时,该寻找算法较优
  • 使用货仓将结点压栈

    • 因为货仓是“后进先出”的数据结构,所以无需追踪结点的指针。与广度优先寻觅相比较,它对内部存款和储蓄器的渴求不高。

    • 假若不能够向左继续遍历,则对栈举办操作

小 O 表示
小 O 表示用于描述某些算法的渐进上界,二者慢慢趋近。

图片 15

时刻复杂度

大 Ω 表示
大 Ω 表示用于描述有个别算法的渐进下界。

Treap:堆树、品质放在普通二叉树与AVL之间

  • O(|E| + |V|)查找:深度优先寻找:O(|E| + |V|)
  • E 是边的数目
  • V 是结点的数额

大数据

图片 16

广度优先寻觅 VS. 深度优先找寻

小 ω 表示
小 ω 表示用于描述有些算法的渐进下界,二者渐渐趋近。

红黑树:总结性质比AVL好
资料

  • 这一难题最轻巧易行的答复便是,选择何种算法取决于树的大小和样子
    • 就大幅来说,较浅的树适用广度优先寻觅
    • 就深度来说,较窄的树适用深度优先搜索

Theta Θ 表示
Theta Θ 表示用于描述有些算法的确界,包涵最小上界和最大下界。

splay树:伸展树,每便搜寻都会开展一次旋转操作,寻觅频率大的结点会旋转至根节点。m次寻找复杂度O(mlgn)

微小的分别

大数据

线段树:高效地打听和修改二个数列中有些区间的新闻

  • 由于广度优先寻觅(BFS)使用队列来囤积结点的新闻和它的子结点,所以需求选用的内部存款和储蓄器大概抢先如今Computer可提供的内部存款和储蓄器(不过其实你不用思量那或多或少)
  • 设若要在某一深度非常的大的树中使用深度优先找出(DFS),其实在探究中山大学可不必走完全体深度。可在
    xkcd 上查看越来越多相关音信。
  • 广度优先寻找趋于一种循环算法。
  • 深度优先寻觅趋于一种递归算法

录制教程
数据结构UC Berkeley Data
Structures

MIT Advanced Data
Structures

树状数组:树状数组通过将线性结构转形成伪树状结构(线性结构只可以每一种扫描成分,而树状结构得以兑现跳跃式扫描),使得修改和求和复杂度均为O(lgn)

三、高效排序基础

算法MIT Introduction to
Algorithms

MIT Advanced
Algorithms

:图的表示:二维数组、邻接表

归并排序

面试宝典
Competitive Programming 3 – Steven Halim & Felix
Halim

Cracking The Coding Interview – Gayle Laakmann
McDowell

Cracking The PM Interview – Gayle Laakmann McDowell & Jackie
Bavaro

Introduction to Algorithms – Thomas H. Cormen, Charles E. Leiserson,
Ronald L. Rivest & Clifford
Stein

图片 17图片 18

定义

End.

图片 19图片 20

  • 一种基于比较的排序算法
    • 将全部数据集划分成至多有四个数的分组
    • 次第比较每一种数字,将小小的数移动到每对数的左边
    • 假设有所的数对都完毕排序,则伊始比较最左多少个数对中的最左成分,产生八个饱含八个数的雷打不动聚焦,当中相当小数在最右侧,最大数在最右面
    • 再次上述过程,直到归并成唯有贰个数据集

http://www.36dsj.com/archives/80717

并查集:并查集常作为另一种复杂的数据结构大概算法的蕴藏结构。常见的使用有:求无向图的连片分量个数,近日集体祖先(LCA),带限制的功课排序,完毕Kruskar算法求最小生成树等。

要点

 

  • 那是最基础的排序算法之一
  • 务必明白:首先将具有数据划分成尽大概小的集合,再作相比较

 

岁月复杂度


  • O(n)最棒的图景:归并排序:O(n)
  • 平均情状:归并排序:O(n log n)
  • 最坏的事态:归并排序:O(n log n)

三、算法资料推荐

快速排序


定义

主旨绪维:动态规划剪枝回溯法

  • 一种基于相比较的排序算法
    • 透过选用平平均数量将一切数据集划分成两片段,并把富有小于平平均数量的要素移动到平平均数量左边
    • 在大多数局地重复上述操作,直到左侧部分的排序达成后,对左边部分进行一样的操作
  • 管理器种类布局援救急速排序进程

排序:快速排序归并排序堆排序桶排序七大排序比较

要点

字符串:KMPKMPKMP

  • 即便快捷排序与不胜枚举任何排序算法有一样的时刻复杂度(一时会更差),但一般比别的排序算法实行得越来越快,举例归并排序。
  • 务必掌握:不断经过平平均数量将数据集对半私分,直到全体的数据都做到排序

数论:排列组合

时光复杂度

 

  • O(n)最棒的事态:归并排序:O(n)
  • O(n log n)平均情状:归并排序:O(n log n)
  • 最坏的地方:归并排序:O(n2)

树:

冒泡排序

遍历:每一种节点都检查

定义

先序遍历:上、左、右

  • 一种基于相比的排序算法
    • 从左往右重复对数字举办两两相比较,把极小的数移到左边
    • 再一次上述手续,直到不再把成分左移

中序遍历:左、上、右

要点

后序遍历:左、右、上

  • 固然这一算法很轻便完结,却是那二种排序方法中效能最低的
  • 务必精晓:每一回向右移动一人,相比较八个成分,并把不大的数左移

 

时刻复杂度

纵深优先寻找DFS通过栈来贯彻

  • O(n)最棒的事态:归并排序:O(n)
  • O(n2)平均情状:归并排序: O(n2)
  • O(n2)最坏的场地:归并排序: O(n2)

图片 21

归并排序 VS. 快捷排序

 

  • 在执行中,飞快排序实行速率更加快
  • 归并排序首先将集聚划分成最小的分组,在对分组进行排序的同时,递增地对分组实行合併
  • 立时排序不断地通过平平均数量划分集结,直到群集递归地稳步

广度优先找寻BFS通过队列来兑现

四、算法类型基础

图片 22

递归算法

 

定义

DP动态规划:牛客网的贰个教学录像非常赞!八、九、十那三集是讲DP的,当然别的摄像也是异常的赞的

  • 在概念进度中调用其自身的算法
    • 递归事件:用于触发递归的尺度语句
    • 着力事件:用于甘休递归的基准语句

http://www.nowcoder.com/live/courses 

要点

 

  • 货仓级过深和栈溢出
    • 例如在递归算法中观察上述三种情况中的任二个,这就倒霉了
    • 那就表示因为算法错误,也许难点规模太过巨大导致难题消除前 RAM
      已耗尽,从而基本领件未有被触发
    • 务必理解:不论基技术件是不是被触发,它在递归中都至关重要
    • 一般性用于深度优先寻觅

假诺是本着笔试、面试的童鞋,还是能再加一本《剑指offer》

迭代算法

还大概有一本《程序猿面试金典》,那本木有看过,可是豆瓣的评分高达9.1分!

定义

 

  • 一种被重新调用有限次数的算法,每一趟调用都是三次迭代
    • 常见用于数据汇总递增移动

 

要点

*图形来自互连网~>_<~

  • 万般迭代的样式为循环、for、while和until语句
  • 把迭代看作是在集结中相继遍历各样成分
  • 平日用于数组的遍历

递归 VS. 迭代

  • 鉴于递归和迭代能够相互完结,两个之间的分别很难清晰地限制。但不可能不清楚:
    • 一般来说递归的表意性越来越强,更易于落到实处
    • 迭代据有的内部存款和储蓄器更少
  • (i.e. Haskell)函数式语言趋向于使用递归(如 Haskell 语言)
  • 命令式语言趋向于使用迭代(如 Ruby 语言)
  • 点击 Stack Overflow
    post

    精晓越来越多详细的情况

遍历数组的伪代码(这正是怎么选择迭代的缘故)

Recursion | Iteration

———————————-|———————————-

recursive method (array, n) | iterative method (array)

if array[n] is not nil | for n from 0 to size of array

print array[n] | print(array[n])

recursive method(array, n+1) |

else |

exit loop

贪心不足算法

定义

  • 一种算法,在执行的同时只选拔满足某一规范的新闻
  • 平时包蕴5个部分,摘自维基百科:
    • 候选集,从该集结中可得出解决方案
    • 选取函数,该函数采纳要加盟消除方案中的最优候选项
    • 方向函数,该函数用于决策某一候选项是或不是有助于消除方案
    • 对象函数,该函数为消除方案或局地解赋值
    • 焚林而猎方案函数,该函数将指明完整的解决方案

要点

  • 用以找到预订难点的最优解
  • 习感到常用于只有少部分成分能满足预期结果的数量集结
  • 普普通通贪婪算法可帮忙一个算法降低时间 复杂度

伪代码:用贪婪算法找到数组中随机三个数字间的最大差值

greedy algorithm (array)

var largest difference = 0

var new difference = find next difference (array[n], array[n+1])

largest difference = new difference if new difference is > largest
difference

repeat above two steps until all differences have been found

return largest difference

这一算法没有需求相比较全体数字两两中间的差值,省略了三回完整迭代。

以下是Big O 核对表

Legend

Excellent

Good

Fair

Bad

Horrible

Data Structure Operations

Data Structure

Time Complexity

 

 

 

 

 

 

 

Space Complexity

 

Average

 

 

 

Worst

 

 

 

Worst

 

Access

Search

Insertion

Deletion

Access

Search

Insertion

Deletion

 

Array

O(1)

O(n)

O(n)

O(n)

O(1)

O(n)

O(n)

O(n)

O(n)

Stack

O(n)

O(n)

O(1)

O(1)

O(n)

O(n)

O(1)

O(1)

O(n)

Singly-Linked List

O(n)

O(n)

O(1)

O(1)

O(n)

O(n)

O(1)

O(1)

O(n)

Doubly-Linked List

O(n)

O(n)

O(1)

O(1)

O(n)

O(n)

O(1)

O(1)

O(n)

Skip List

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

O(n)

O(n)

O(n)

O(n log(n))

Hash Table

O(1)

O(1)

O(1)

O(n)

O(n)

O(n)

O(n)

Binary Search Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

O(n)

O(n)

O(n)

O(n)

Cartesian Tree

O(log(n))

O(log(n))

O(log(n))

O(n)

O(n)

O(n)

O(n)

B-Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

Red-Black Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

Splay Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

AVL Tree

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(n)

Array Sorting Algorithms

Algorithm

Time Complexity

 

 

Space Complexity

 

Best

Average

Worst

Worst

Quicksort

O(n log(n))

O(n log(n))

O(n^2)

O(log(n))

Mergesort

O(n log(n))

O(n log(n))

O(n log(n))

O(n)

Timsort

O(n)

O(n log(n))

O(n log(n))

O(n)

Heapsort

O(n log(n))

O(n log(n))

O(n log(n))

O(1)

Bubble Sort

O(n)

O(n^2)

O(n^2)

O(1)

Insertion Sort

O(n)

O(n^2)

O(n^2)

O(1)

Selection Sort

O(n^2)

O(n^2)

O(n^2)

O(1)

Shell Sort

O(n)

O((nlog(n))^2)

O((nlog(n))^2)

O(1)

Bucket Sort

O(n+k)

O(n+k)

O(n^2)

O(n)

Radix Sort

O(nk)

O(nk)

O(nk)

O(n+k)

Graph Operations

Node / Edge Management

Storage

Add Vertex

Add Edge

Remove Vertex

Remove Edge

Query

Adjacency list

O(|V|+|E|)

O(1)

O(1)

O(|V| + |E|)

O(|E|)

O(|V|)

Incidence list

O(|V|+|E|)

O(1)

O(1)

O(|E|)

O(|E|)

O(|E|)

Adjacency matrix

O(|V|^2)

O(|V|^2)

O(1)

O(|V|^2)

O(1)

O(1)

Incidence matrix

O(|V| ⋅ |E|)

O(|V| ⋅ |E|)

O(|V| ⋅ |E|)

O(|V| ⋅ |E|)

O(|V| ⋅ |E|)

O(|E|)

Heap Operations

Type

Time Complexity

 

 

 

 

 

 

 

Heapify

Find Max

Extract Max

Increase Key

Insert

Delete

Merge

Linked List (sorted)

O(1)

O(1)

O(n)

O(n)

O(1)

O(m+n)

Linked List (unsorted)

O(n)

O(n)

O(1)

O(1)

O(1)

O(1)

Binary Heap

O(n)

O(1)

O(log(n))

O(log(n))

O(log(n))

O(log(n))

O(m+n)

Binomial Heap

O(1)

O(log(n))

O(log(n))

O(1)

O(log(n))

O(log(n))

Fibonacci Heap

O(1)

O(log(n))

O(1)

O(1)

O(log(n))

O(1)

Big-O Complexity Chart

 

图片 23

Computer科学中最根本的三14个算法

  1. A*
    寻找算法——图形寻觅算法,从给定起源到给定终点总结出路线。个中使用了一种启发式的猜想,为种种节点猜度通过该节点的顶级渠道,并以之为种种地方排定次序。算法以拿到的次第访问那个节点。因而,A*寻觅算法是极品优先寻觅的典范。
  2. 集束找出(又名定向搜索,Beam
    Search)——最好优先找出算法的优化。使用启发式函数评估它检查的每一个节点的力量。不过,集束寻找只好在各样深度中发觉最前面包车型大巴m个最符合条件的节点,m是固定数字——集束的大幅。
  3. 二分查找(Binary
    Search)——在线性数组中找特定值的算法,每种步骤去掉五成不符合供给的多寡。
  4. 分段界定算法(Branch and
    Bound)——在多样最优化难点中探求特定最优消除决方案的算法,非常是针对离散、组合的最优化。
  5. Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。
  6. 数据压缩——选取一定编码方案,使用更加少的字节数(或是别的信息承载单元)对音讯编码的进程,又叫来源编码。
  7. Diffie-Hellman密钥沟通算法——一种加密协议,允许双方在预先不打听对方的景观下,在不安全的通讯信道中,共同构建共享密钥。该密钥以往可与贰个对称密码一同,加密承继报导。
  8. Dijkstra算法——针对未有负值权重边的有向图,总结在那之中的纯粹起源最短算法。
  9. 离散微分算法(Discrete differentiation)
  10. 动态规划算法(Dynamic
    Programming)——体现相互覆盖的子难点和最优子架构算法
  11. 欧几里得算法(Euclidean
    algorithm)——计算八个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原来》。
  12. 愿意-最大算法(Expectation-maximization
    algorithm,又名EM-Training)——在总计测算中,期望-最大算法在可能率模型中追寻大概最大的参数推测值,当中模型正视于未开采的私人民居房变量。EM在五个步骤中交替总结,第一步是计量期望,利用对隐蔽变量的共处猜度值,总计其最大大概猜测值;第二步是最大化,最大化在第一步上求得的最大恐怕值来总括参数的值。
  13. 立刻傅里叶转变(法斯特 Fourier
    transform,FFT)——计算离散的傅里叶转换(DFT)及其反转。该算法应用范围很广,从数字信号处理到化解偏微分方程,到飞快总计大整数乘积。
  14. 梯度降低(Gradient
    descent)——一种数学上的最优化算法。
  15. 哈希算法(Hashing)
  16. 堆排序(Heaps)
  17. Karatsuba乘法——供给变成上千位整数的乘法的系列中选取,比如Computer代数系统和命运程序库,借使选择长乘法,速度太慢。该算法开采于一九六一年。
  18. LLL算法(Lenstra-Lenstra-Lovasz lattice
    reduction)——以格规约(lattice)基数为输入,输出短正交向量基数。LLL算法在偏下公共密钥加密方法中有大量采纳:手提包加密系统(knapsack)、有一定设置的EvoqueSA加密等等。
  19. 最大流量算法(Maximum
    flow)——该算法试图从一个流量网络中找到最大的流。它优势被定义为找到这么四个流的值。最大流难题得以作为更复杂的互联网流难点的特定情景。最大流与网络中的分界面有关,那正是最大流-最小截定理(马克斯-flow
    min-cut theorem)。福特-Fulkerson 能找到二个流互连网中的最大流。
  20. 合併排序(Merge Sort)
  21. Newton法(Newton’s
    method)——求非线性方程(组)零点的一种首要的迭代法。
  22. Q-learning学习算法——那是一种通过学习动作值函数(action-value
    function)完毕的加深学习算法,函数采用在给定状态的加以动作,并总计出希望的效益价值,在未来遵循一定的战术。Q-leanring的优势是,在不供给情状模型的事态下,能够对照可选择行动的梦想作用。
  23. 四次筛法(Quadratic
    Sieve)——今世整数因子分解算法,在实施中,是当下已知第二快的此类算法(稍差于数域筛法Number
    菲尔德Sieve)。对于112个人以下的拾一位整数,它仍是最快的,而且都感到它比数域筛法更简短。
  24. RANSAC——是“RANdom SAmple
    Consensus”的缩写。该算法依照一多级观望获得的数量,数据中包罗非常值,臆度二个数学模型的参数值。其基本要是是:数据包涵非异化值,也正是能够通过某个模型参数解释的值,异化值正是那几个不适合模型的数根据地。
  25. 翼虎SA——公钥加密算法。第一个适用于以签署作为加密的算法。逍客SA在电商行个中仍普及使用,大家也信任它有丰硕安全长度的公钥。
  26. Schönhage-Strassen算法——在数学中,Schönhage-Strassen算法是用来产生大整数的乘法的快捷渐近算法。其算法复杂度为:O(N
    log(N) log(log(N))),该算法使用了傅里叶转换。
  27. 单纯型算法(Simplex
    Algorithm)——在数学的优化理论中,单纯型算法是常用的工夫,用来找到线性规划难题的数值解。线性规划难点包括在一组实变量上的一两种线性不等式组,以及一个等待最大化(或最小化)的固定线性函数。
  28. 离奇值分解(Singular value
    decomposition,简称SVD)——在线性代数中,SVD是关键的实数或复数矩阵的分解方法,在能量信号管理和计算中有二种运用,譬如总括矩阵的伪逆矩阵(以求解最小二乘法难点)、化解超定线性系统(overdetermined
    linear systems)、矩阵逼近、数值天气预先报告等等。
  29. 求解线性方程组(Solving a system of linear
    equations)——线性方程组是数学中最古老的主题材料,它们有好多行使,比如在数字实信号管理、线性规划中的预计和预测、数值深入分析中的非线性问题逼近等等。求解线性方程组,可以行使高斯—约当消去法(Gauss-Jordanelimination),或是柯列斯基分解( Cholesky decomposition)。
  30. Strukturtensor算法——应用于情势识别领域,为具备像素搜索一种总结办法,看看该像素是或不是处在同质区域(
    homogenous region),看看它是或不是属于边缘,依然是一个极限。
  31. 联合查找算法(Union-find)——给定一组成分,该算法平常用来把那几个因素分为四个分其他、互相不重合的组。不相交集(disjoint-set)的数据结构能够追踪这样的切分方法。合併查找算法能够在此种数据结构上到位八个有效的操作:
    • 搜索:判别某一定成分属于哪个组。
    • 统一:联合或合併四个组为四个组。
  32. 维特比算法(Viterbi
    algorithm)——寻觅藏身状态最有望体系的动态规划算法,这种种类被称作维特比路径,其结果是一名目好些个能够考查到的轩然大波,极其是在隐藏的马克ov模型中。

现实中算法

Linux内核中的基本数据结商谈算法

  1. 链表双向链表无锁链表
  2. B+
    ,代码中的注释将会告知你某个课本中不能够学到的原委:

    那是贰个简练的B+树完成,小编写它的目标是当做练兵,并以此掌握B+树的劳作规律。结果该兑现发挥了它的实用价值。

    贰个不日常在课本中谈起的技巧:最小值应该献身左侧,而不是左侧。贰个节点内有着被采用的槽位应该在左边,未有动用的节点应该为NUL,超越贰分一的操作只遍历二遍具有的槽位,在率先个NUL处终止。

  3. 带权重的平稳列表用于互斥锁驱动等;

  4. 红黑树用于调解、虚拟内部存款和储蓄器管理、追踪文件讲述符和目录条目款项等;

  5. 区间树
  6. Radix树,用于内部存款和储蓄器管理、NFS相关查找和网络有关的效果;

    radix树的四个广阔的用法是保存页面结构体的指针;

  7. 优先级堆,文字上的叙述,重借使在课本中贯彻,用于control
    group系统
    ;

    含蓄指针的只同意轻松插入的静态大小优先级堆,基于CLPAJERO(算法导论)第七章

  8. 哈希函数,引用Knuth和他的一篇诗歌:

    Knuth建议采取与机械和工具字长所能表明的最大整数约成黄金比例的素数来做乘法散列,Chuck
    Lever 证实了那几个技艺的管用;

    http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

    那些选拔的素数是位稀疏的,也正是说对她们的操作能够利用移动和加法来替换机器中一点也不快的乘法操作;

  9. 有个别代码,比方这些驱动,他们是上下一心达成的哈希函数

  10. 哈希表,用于落到实处索引节点文件系统完整性检查等;

  11. 位数组,用于拍卖flags、中断等,在Knuth第四卷中有对其特色的叙述;
  12. Semaphores
    spin
    locks
  13. 二叉树寻找用于暂停处理注册缓存查找等;
  14. 动用B-树实行二叉树查找
  15. 深度优先搜索和她的变体被使用于目录配置

    在命名空间树中举行多少个修改过的纵深优先算法,开头(和苏息于)start_handle所分明的节点。当与参数相称的节点被发觉之后,回调函数将会被调用。借使回调函数再次回到一个非空的值,搜索将会应声截至,那么些值将会回传给调用函数;

  16. 广度优先搜索用来在运作时检查锁的没有错;

  17. 链表上的集结排序用于垃圾堆回收文件系统管理等;
  18. 在某个驱动程序的库函数里,冒泡排序居然也被完结了
  19. Knuth-Morris-Pratt
    字符串相配

    Knuth、Morris和 Pratt
    [1]福如东海了叁个线性时间复杂度字符串相称算法。该算法完全避开了对转移函数DELTA的显式总计。其相配时间为O(n)(其中n是文件长度),只利用一个帮助函数PI[1…m](个中m是方式的长度),情势的预管理时间是O(m)。PI这一个数组允许DELTA函数在须求时能高效运营。大要上,对私行状态q=0,1,…,m和大肆SI达托霉素A中的字符”a”,PI[“q”]保留了单独于”a”的音信,并用于总结DELTA(“q”,
    “a”)。由于PI那一个数组只含有m个条款,而DELTA包涵O(m|SI红霉素A|)个条文,大家经过估测计算PI进而在预管理时间保存|SI罗红霉素A|的周密,而非计算DELTA。

    [1] Cormen, Leiserson, Rivest, Stein Introdcution to Algorithms,
    2nd Edition, MIT Press

    [2] See finite automation theory

  20. Boyer-Moore情势匹配,如下是援引和对任何算法的利用提议;

    Boyer-Moore字符串相配算法:

    [1] A Fast String Searching Algorithm, R.S. Boyer and Moore.
    Communications of the Association for Computing Machinery, 20(10),
    1977, pp. 762-772.
    http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf

    [2] Handbook of Exact String Matching Algorithms, Thierry
    Lecroq, 2004
    http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf

    只顾:由于Boyer-穆尔(BM)自右向左做协作,有一种或许性是三个相配布满在分歧的块中,这种情状下是不可能找到其它相称的。

    万一您想确定保证那样的作业不会发生,使用Knuth-Pratt-Morris(KMP)算法来代替。也正是说,依据你的装置选拔适宜的字符串查找算法。

    如果你利用文本寻觅架构来过滤、网络侵犯检查测试(NIDS)或然其余安全为目标,那么选择KMP。假诺你关系品质,比如您在分拣数据包,并应用服务品质(QoS)战略,并且你不介意恐怕须求在布满在多个部分中卓殊,然后就选取BM。

Chromium 浏览器中的数据结构和算法

  1. 伸展树

    此树会被分配政策参数化,那么些计谋担当在C的即兴存款和储蓄空间和区域中分配列表,参见zone.h

  2. 德姆o中动用了Voronoi

  3. 依照Bresenham算法的价签管理

同期,代码中还含有了部分第三方的算法和数据结构,比方:

  1. 二叉树
  2. 红黑树
  3. AVL树
  4. 用于压缩的Rabin-Karp字符串相配
  5. 计量自动机的后缀
  6. 苹果完结的布隆过滤器
  7. 布氏算法

编制程序语言类库

  1. C++
    STL
    ,包罗的有列表、堆、栈、向量、排序、寻找和堆操作算法
  2. Java
    API
    十一分广阔,包罗的太多
  3. Boost C++
    类库
    ,包罗了诸如Boyer-穆尔和Knuth-Morris-Pratt字符串相配算法等;

分红和调整算法

  1. 这几天起码使用算法有多样兑现方式,在Linux内核中是依据列表完毕的;
  2. 其余或然必要领悟的是先入先出、最不时用和轮询;
  3. VAX、VMS系统中山高校量运用FIFO的变体;
  4. Richard
    Carr
    电子表算法被用来Linux中页面帧替换;
  5. AMD i860处理器中采纳了随机替换战略;
  6. 自适应缓存替换被用来一些IBM的存款和储蓄调整中,由于专利原因在PostgreSQL只有大致的施用;
  7. Knuth在TAOCP第一卷中涉嫌的同伴内部存款和储蓄器分配算法被用于Linux内核中,FreeBSD和Facebook都在利用jemalloc并发分配器;

*nix系统中的焦点组件

  1. grep和awk都落到实处了采纳汤普森-McNaughton-Yamada塑造算法实现从正则表达式中开创NFA
  2. tsort达成了拓扑排序
  3. fgrep实现了Aho-Corasick
    字符串相称算法
  4. GNU grep,据作者Mike
    Haertel所说,实现了Boyer-Moore算法
  5. Unix中的crypt(1)实现了哑谜机(Enigma
    Machine)中的加密算法的变种;
  6. Doug Mcllroy基于和James合营的原型落成的Unix
    diff
    ,比用来计量Levenshtein距离的行业内部动态规划算法越来越好,Linux版本被用来测算最短编辑距离;

加密算法

  1. Merkle树,越发是泰格Tree Hash的变种,用于点对点的次第,比如GTK
    Gnutella

    LimeWire;
  2. MD5用于为软件包提供销商业学校验码,还用于*nix系统(Linux实现)中的完整性校验,相同的时候她还援助Windows和OS
    X系统;
  3. OpenSSL兑现了亟待加密算法,诸如AES,Blowfish,DES,SHA-1,SHA-2,GL450SA,DES等;

编译器

  1. yacc和bison实现了LALR解析器
  2. 决定算法用于基于SSA方式的最优化编写翻译器;
  3. lex和flex将正则表达式编写翻译为NFA;

调减和图片管理

  1. 为GIF图片格式而产出的Lempel-Zivsraf算法在图纸处理程序中时时被采纳,从三个简便的*nix组件转化为一个繁杂的次第;

  2. 运转长度编码被用来生成PCX文件(用于Paintbrush那个程序中),压缩BMP文件和TIFF文件;

  3. 小波压缩(Wavelet压缩)是JPEG 两千的底蕴,所以具备生成JPEG
    三千文件的单反相机都是完毕了这一个算法;

  4. Reed-Solomon纠错用于Linux内核、CD驱动、条形码读取,并且结合卷积从航行团队举行图纸传输;

争辩驱动条目款项学习算法(Conflict Driven Clause Learning)

自三千年以来,在工业标准中的SAT(布尔知足性主题材料)求解器的运营时刻每年都在成倍收缩。这一前行的贰个非常重大的案由是冲突驱动条目款项学习算法(Conflict
Driven 克劳斯e Learning)的采纳,它结合了DavisLogemann和乐福land的封锁编制程序和人工智能商讨本领的原始故事集中有关布尔约束传播的算法。具体来说,工业建立模型中SAT被以为是三个回顾的题目(见讨论)。对小编的话,这是近代最光辉的打响故事之一,因为它构成了进取的算法、奇妙的准备思路、实验报告,并以一致的共同努力来化解那个标题。马里克和Zhang的CACM故事集是三个很好的翻阅材质。好多高校都在讲授那些算法,但常见是在逻辑或方式化方法的教程中。

 

 


指望对您公司应用开荒与厂家音信化有帮带。 其余您大概感兴趣的文章:

视觉直观感受 7 种常用的排序算法

匈牙利(Magyarország) Sapientia 大学的 6
种排序算法舞蹈录制

录像:6 秒钟演示 15 种排序算法

SORTING:可视化展示排序算法的原理,帮忙单步查看

VisuAlgo:通过动画学习算法和数据结构

软件开垦的专门的学业化
IT基础架构规划方案一(网络体系规划)
IT基础架构规划方案二(Computer体系与机房规划安插) 
IT基础架构规划方案三(IT基础软件和系统规划)
集团应用之性质实时衡量系统演变
云总括参照他事他说加以侦察架构几例
智能运动导游化解方案简单介绍
人力能源管理体系的衍生和变化

如有想打听更加多软件研发 , 系统 IT集成 , 公司音讯化
等资源音讯,请关切本身的微信订阅号:

图片 24

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
正文版权归作者和和讯共有,招待转发,但未经小编同意必须保留此段表明,且在文章页面显明地点给出原来的小说连接,不然保留追究法律义务的义务。
该小说也还要宣告在自己的单独博客中-Petter Liu
Blog

相关文章