排序3:计数排序、桶排序、基数排序
我们把时间复杂度为O(n)的排序算法称为线性排序。之所以能做到线性的时间复杂度,主要原因是,这样的算法是并非基于比较的排序算法,都不涉及元素之间的比较操作。但是如此高效是有代价的,线性排序的适用场景十分有限,条件苛刻。
我们把时间复杂度为O(n)的排序算法称为线性排序。之所以能做到线性的时间复杂度,主要原因是,这样的算法是并非基于比较的排序算法,都不涉及元素之间的比较操作。但是如此高效是有代价的,线性排序的适用场景十分有限,条件苛刻。
排序在实际生产中是一种极其常见的操作,但是通常我们会使用现成的算法实现。更多时候是库或者第三方应用给你的数据本身就是有序的。对于大量数据的操作,优先进行排序是一个良好的习惯,在你后续的操作上都能从这个有序数据中受益。
散列表也就是哈希表,是一种键值对(key-value pair)数据结构。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。
哈希表的本质是将键(key)通过散列函数获得散列值(哈希值)映射到数组的index上,使得我们可以利用上数组可以通过index随机访问数据的特性,通过key直接访问value。
链表,即使是有序的链表,在插入、删除,查找之前都需要就行查找操作以确认操作位置。而查找过程只能通过遍历完成,使得很多时候,数据的操作都要有O(n)的时间复杂度。
链表优化
那么,我们能否构建一条快速通道,在元素小于目标元素的时候跳过大多数小于当前数据的元素,从而实现快速查找呢?