排序法

这就是搜索引擎--读书笔记五--索引的建立与更新

社会主义新天地 提交于 2020-03-31 07:31:13
索引的建立和更新 索引的建立 前一总结里说到,如果索引结构建立好了,可以提高搜索的速度,那么给定一个文档集合,索引是如何建立起来的呢?建立索引的方式有很多种,在这里我就书中提到的三种方法简单总结一下。 两遍文档遍历法 第一次文档遍历 第一次扫描文档集合时,并没有立即开始建立索引,而是收集一些的统计信息,比如文档集合包含的文档个数N、文档集合内包含的不同单词个数M以及每个单词在哪些文档中出现过的信息DF等等。将所有单词对应的DF值全部相加,就可以知道建立最终的索引需要多少内存了,然后在内存中将连续存储区划分成不同大小的片段,词典内某个单词根据自己对应的DF信息,可以通过指针指向属于自己的内存片段的起始位置和终止位置 , 这样在第二遍扫描中,这个单词对应的倒排列表信息会被填充进这个片段中。 第二次文档遍历 这一次扫描的时候,就开始真正建立每个单词的倒排列表信息了,即对每个单词来说,获得包含这个单词的每个文档的文档ID,以及这个单词在文档中出现的次数,这样就可以不断填充第一次遍历扫描所分配的内存空间。当然,如果要记录单词在文档中出现的位置也是可以的,第一次扫描中分配内存时加上这个位置信息就可以了。 值得注意的是 :此方法完全是在内存里完成索引的创建过程的,而后面两种方法则是通过内存和磁盘相互配合来完成索引建立任务的。而正因为创建索引是在内存中完成的,所以就要求内存一定要足够大

快速排序法

匿名 (未验证) 提交于 2019-12-03 00:34:01
快速排序的平均效率为O(n * long n),最坏的情况为O(n^2),这和之前的选择排序法效率快很多,但也有局限性。 假设有2个数组,一个数组为空,另外一个为1, [_,1] ,那么排序就知道返回的是1,没有可比性,那如果有3个都有值的数组呢? [ 3 , 2 , 1 ] [ 3 , 2 , 1 ] 那么我们取中间的 2 为比较量,把小于2的放在左边,把大于2的放在右边。那么就行成了外部有序的数组,内部是无序的。什么意思呢? 整体看是从小到大的顺序排列,而内部顺序还未排序 [ [无序(小于2的数组)] 2 [无序(大于2的数组)] ] 就是这个意思,那么快速排序法就是将多个元素的数组,一直筛选到没有可比性为止。 python def quicksort (array) : if len(array)< 2 : return array else : index=math.ceil((len(array) - 1 ) / 2 ) piovt=array[index] #选出大于piovt的值 greater=[i for i in array if i > piovt] #选出小于piovt的值 less=[i for i in array if i < piovt] #选出等于piovt的值 center=[array[i] for i in range( 0 ,len

算法排序----插入排序法

自古美人都是妖i 提交于 2019-12-01 07:56:11
接下来我来讲述一下插入排序法。 首先来解释一下插入排序法的原理,它的原理是每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。那么也就是说,每次插入一个数都要对原来排序好的那部分序列进行重新的排序,时间复杂度同样为O(n²)。 这种算法是稳定的排序方法。 直接插入排序算法分析 根据代码我们来解释一下直接插入排序的核心 例如,我们要对5,3,4,6,2这几个数进行排序 a[] 0 1 2 3 4 值 5 3 4 6 2 当这个数组进入函数后,下标首先定义到i = 1,即排序前,首先定义为a[0] = 5即是有序的。 进入循环内,比较a[1] 是否小于 a[0] 发现是小于的,这个时候按理说是要把a[0]这个元素右移动1位。然后将a[1]这个元素插在a[0]的位置上 但是考虑到这样子将覆盖原来的a[1]的值,所以先将a[1]的值拷贝一份给temp,然后将a[0]右移一位,再将temp的值传给a[0] .即 a[] 0 1 2 3 4 值 3 5 4 6 2 这时i =2了。此时a[0],a[1]属于有序的序列了,我们此时再次比较a[2]是否小于a[1](前一位),4<5,满足if条件 temp = a[2] 先拷贝一份,再将a[1] 右移一位,再次比较a[0]是否大于temp ,发现3并没有大于4,由此可见只要i前面有序数存在大于a[i

八大排序代码及时间测试

落花浮王杯 提交于 2019-11-29 22:36:26
大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列表的时间也不尽相同。今天,我就准备了八种排序的python代码,并且准备测试一下他们计算的时间 1基数排序 基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类 # 统计这个列表中数字最大的数字有几位 def radix_sort_nums(nums): max = nums[0] for i in nums: if max < i: max = i times = 0 while max > 0: max = int(max/10) times += 1 return times # 每个数字各个位置的数字大小,比如(123,1)则是3,(123,2)则是2 def get_num(num,n): return (int(num/(10**(n-1)))) % 10 # 主程序 def radix_sort(nums): count = 10*[None] # 定义的数组,用于存放当前位数的元素个数 bucket = len(nums)*[None] # 用于暂时存放排序结果 # 分别从个位/十位/百位开始循环 for pos in range(1, radix_sort_nums(nums)+1): #

Java插入排序法

青春壹個敷衍的年華 提交于 2019-11-29 03:15:59
本人学生党一枚。Java学习过程,写这个博客纯属当复习,有什么错误的地方请大家指出来在评论里指点指点我。谢谢 概念: 插入排序法是插入式排序法的一种。 基本思想是: 把n个待排序的元素看成一个有序表和无序表。一开始有序表只包含一个元素,无序表中包含n-1个元素。排序过程中每次从无序表中取出第一个元素,把它依次与有序表中的元素进行比较。然后把它插入到有序表的适当位置,形成新的有序表。 通俗的讲:假设第一个元素是有序的,后面的元素往前插入,依次进行比较,小的往前挪,大的往后挪,找到合适的位置插入。打个形象的比方就是打扑克牌时的摆牌。 插入过程: 思路: 1:外层循环:因为第一个是有序的,所以不用参与插入,所以从arr[i] 开始。 2:设置插入的数由上面可得出 从 arr[i] 开始。 3:设置被插入数的下标,往前插所以是 i - 1。 4:内层循环:如果插入的数比被插入的数小,就要把被插入的数向后移,插入的数向前移 index–就退出了循环。 5:当不满足循环条件后就找到了合适的位置插入。 代码: package com.test_1; import java.util.Calendar; public class Demo5_3 { public static void main(String[] args) { //构建一个庞大的无序数组用于测试时间 int len= 10 ;

排序和查找1

前提是你 提交于 2019-11-28 08:43:51
排序是将一组数据,依指定的顺序进行排列的过程。 排序的分类: 1)内部排序:   指将需要处理的所有数据都加载到内部存储器中进行排序。   包括(交换式排序法、选择式排序法和插入式排序法); 2)外部排序法:   数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。   包括(合并排序法和直接合并排序法) 交换式排序法: 交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。 交换式排序法又可分为两种:   1)冒泡排序法 (Bubble sort )   2)快速排序法 (Quick sort) 交换式排序法--冒泡排序法   冒泡排序(Bubble Sorting) 的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。   因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(优化) 下图演示了一个冒泡过程的例子: 总结冒泡排序的规则:   1、一共会经过 arr.length-1次的轮数比较,每一轮将会缺点一个数的位置。   2