算分-Searching

Binary Search Trees:

  BST树里首先讲了插入删除查找等操作,比较常规。查找:最差O(n),最好O(logn),平均O(logn);插入:成功的插入平均O(logn),最差也是O(n);删除里有三种情况,对于一次成功的删除,待删除的结点v的子结点个数只可能是0、1、2,如果是0的话就直接删除无妨,是1的话就把其子结点作为待删除结点的父节点的子结点(原话是:make that child the child of the parent of v),如果有2个子结点的话,就从左子树里面找出最大的结点代替v就可以了。

  BST树中还讲了最优BST树的问题,之前的一些文章里也有涉及(高级数据结构),直接列公式:C[i,j] = min{C[i,k-1] + C[k+1,j] + p[i,j] - pk}, i <= k <= j,其中p[i,j]表示pi~pj的和,C[i,j]表示一段区间内的最优BST树的代价,所以用动态规划的思想就可以解决,但三层循环i,j,k,不难发现复杂度是O(n^3),其实是比较高的。文中提出了一个优化的思想,用R[i,j]来记录对应的根结点编号,发现它的表格形式里关于行和列都是单调递增的,于是对于C[i,j]的R[i,j],只要尝试R[i,j-1]到R[i+1,j]中的所有R就可以了,不难证明此时的复杂度可以降到O(n^2)。

Red-black Trees:

  红黑树在之前专门有提到过,此处不再讲述具体的内容。但在这之前作者提到了2-3-4树(每一个内部节点的孩子结点数目是2/3/4,而且所有的叶子结点在一个高度),不难算出高度为h的2-3-4树的最大节点数和最小节点数都是常数的h次幂,所以一般操作都是O(logn)的。值得一提的2-3-4树和RB树有一个对应的关系。

Amortized Analysis:

  摊还分析对算法的设计产生了深远的影响,之后我们将会看到一些数据结构,通过摊还分析可以看到它的本质。

  第一个提到的模型是binary counting,假设一个数以二进制的形式存在数组A里面,下面的代码来计算存在A里面的数:

1 loop i = 0;
2      while A[i] = 1 do A[i] = 0; i++ endwhile;
3     A[i] = 1.
4 forever

  比如从0数到15需要变化bit一共26次,对于一个数n最多是[logn] + 1位,所以最多变化n([logn] + 1)次,还有几种分析的方法:

  第一种叫做aggregation:我们可以找规律发现对于数n,有j个后缀1的小于等于n = 2^k - 1的数i一共有2^(k-j) = (n+1) / 2^j,然后再对j求一个期望可以得到总的操作次数是小于2n+2的,这样一来我们可以摊还到每一个操作,平均代价是常数级别的;

  第二种叫做accounting:比如我们把0->1的变化付2元,1->0的变化付0元,而0->1的2元实际上分为两部分,一部分是bit change,另一部分是bit不变,也就是0-1-1,后面的1元用来偿还之后的1-0的价钱,也就是说最后的代价是最多是2n;

  第三种方法比较奇特,叫做势函数,ci表示实际操作代价,ai = ci + pi - p(i-1),则sum(ai) = sum(ci) + pn - p0,其中是关于状态i的一个代价,使得p0 = 0, pn >= 0,这就保证所有的ai之和大于等于ci,即我们构造的代价cover了实际的代价。设pi为数字i中的1的个数,bi为后缀1的个数,则pi - p(i-1) = bi - b(i-1) = (b(i-1) - t(i-1) + 1) - b(i-1) = 1 - t(i-1), ci + pi - p(i-1) = 1 + t(i-1) + 1 - t(i-1)  = 2, 那么所有的ai之和就是2n,也就是说所有的代价之后小于等于2n,平均每次也是常数次的代价。

Splay Trees:

  splay树中涉及一个代价的问题,这在之前高级数据结构一章中有所介绍,不再介绍。

Homework:

  问题1:考虑数组A[1,n],其中A[1] >= A[2], A[n-1] <= A[n]。我们说i是一个局部最小值如果A[i-1] >= A[i] <= A[i+1],注意A至少有一个局部最小值。1)我们显然可以在O(n)的条件下找出这个点i,请你设计出更高效的算法。2)分析自己设计的算法

  问题2:一颗树有n个顶点,如何在O(n)的时间内求出最小点覆盖(是一个点的集合,每条边都有对应的端点在这个集合里面,而且是这样的集合中点的数目最少的)

  问题3:证明2n次旋转足以把一颗有n个结点的bst转换另一个结点相同但是结构不同的bst

  问题4:设计一个数据结构,存储具有(key, cost)的结点,要求完成以下四个操作,而且每个操作每个操作最多耗费为logn。

  1)add(k,c),加入(k,c)这个结点. 2)remove(k,c),删除key = k的结点. 3)max(k1,k2)(k1 <= k2),返回k1 <= key <= k2的所有结点中最大的cost,4)count(c1,c2)(c1 <= c2),返回cost在c1~c2中的节点个数

原文地址:https://www.cnblogs.com/zyna/p/12242353.html

时间: 2024-08-30 11:49:21

算分-Searching的相关文章

Lucene TF-IDF 相关性算分公式

转自: http://lutaf.com/210.htm Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文档频率,TF-IDF是一种统计方法,或者被称为向量空间模型,名字听起来很复杂,但是它其实只包含了两个简单规则 某个词或短语在一篇文章中出现的次数越多,越相关 整个文档集合中包含某个词的文档数量越少,这个词越重要 所以一个term的TF-IDF相关性等于 TF * IDF 这两个规则非常简单,这就是TF-IDF的核

Lucene TF-IDF 相关性算分公式(转)

Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文档频率,TF-IDF是一种统计方法,或者被称为向量空间模型,名字听起来很复杂,但是它其实只包含了两个简单规则 某个词或短语在一篇文章中出现的次数越多,越相关 整个文档集合中包含某个词的文档数量越少,这个词越重要 所以一个term的TF-IDF相关性等于 TF * IDF 这两个规则非常简单,这就是TF-IDF的核心规则,第二个的规则其实有缺陷的,他单纯地认为文本频率小的

Solr相似度算法一:Lucene TF-IDF 相关性算分公式

Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文档频率,TF-IDF是一种统计方法,或者被称为向量空间模型,名字听起来很复杂,但是它其实只包含了两个简单规则 某个词或短语在一篇文章中出现的次数越多,越相关 整个文档集合中包含某个词的文档数量越少,这个词越重要 所以一个term的TF-IDF相关性等于 TF * IDF 这两个规则非常简单,这就是TF-IDF的核心规则,第二个的规则其实有缺陷的,他单纯地认为文本频率小的

UnixBench算分介绍

关于如何用UnixBench,介绍文章很多,这里就不展开了.这里重点描述下它是如何算分的. 运行参数碰到很多客户,装好后,直接./Run,就把结果跑出来了,然后还只取最后一个分值,比谁高谁低.下面列一下4C8G的结果: Benchmark Run: 一 6月 25 2018 20:25:47 - 20:54:194 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 30971

常用搜索引擎的算分,你get了嘛?

搜索引擎发展至今,已公布了多种算法.作为SEOER的你,还不懂,就out啦.懂了不会用,也是然并卵的一种行为.了解算法知识并不懂得如何把算法实践于SEO工作的你,还是处于学生思维,是时候该升级了.且听我介绍这9个算法及用法 NO.1 绿萝算法 算法内容:为了打击买卖外链.批量群发外链的行为.目的,避免站长不用心做用户体验,纯粹的利用搜索引擎漏洞投机取巧,影响搜索引擎自身用户体验.主要打击的网站类型有,超链中介.出售链接网站.购买链接的网站. 实操说明:还不知死活,拼命买卖外链的小伙伴,赶紧收手吧

算分-DESIGN THECHNIQUES

Divide-and-Conquer: 教材中是用快排作为例子介绍分治算法的,主要的是几个式子: 最坏情况下的快排:T(n) = n + T(n-1) 最好情况下的快排:T(n) = n + 2*T((n-1) / 2) 随机情况下的快排:T(n) = n + 1/n * sum(T(i) + T(n-1-i)) for i = 0,1,2,...,n-1 值得一提的是一个尾递归的问题,如果是带有尾递归的话,调用栈的空间占用会达到n的规模,但是取消尾递归且每次调用较小的那一段,调用栈的空间只需要

算分-PRIORITIZING

Heaps and Heapsort: 堆是一种快速访问最大优先级元素的数据结构,这是快速实现选择排序的基础,但是总体来说平均速度比快排要慢一点,不过其最坏情况和平均情况是差不多的. 首先是堆的定义,每个结点比它的孩子结点都小(所以父节点最小),或者每个结点都比它的孩子结点大(父节点最大),把A[1,n]看做一个堆,i的两个孩子结点分别是2i和2i+1,这个非常方便实用.接着是删除堆的最小值(最大值同理),想法就是先删除最小值,然后把最后一个元素放到根节点并且不断sift-down,这个是一个结

算分-NP COMPLETENESS

Easy and Hard Problems: NP完全理论是为了在可处理的问题和不可处理的问题之间画一条线,目前最重要的问题是是否这两者是本质不同的,而这个问题目前还没有被解决.典型的结果是一些陈述,比如“如果问题B有一个多项式时间的算法,那么C也会有一个多项式时间的算法”,或者逆否表述为“如果C没有多项式时间的算法,那么B也没有”.第二个表述是说,对于一些问题C以及一个新的问题B,我们先去找是否有这种关系,如果有的话我们可能不想去做问题B,先来看看C.为了描述这些东西,需要不少形式主义的记号

elasticsearch 算分脚本

可以将上一章的脚本,放到elasticsearch/config/scripts 目录下,比如命名为my_script.groovy. 然后使用下面的代码进行调用: "script_score" : { "script" : { "file" : "my_script" } } 这个文件夹的文件60s更新一次,可以随时增加或者删除.  script_score 官方网站上存在性能问题,建议使用Native Java Scrip