精华内容
下载资源
问答
  • 信息检索算法论文集

    2017-07-24 11:35:07
    信息检索算法论文集
  • P2P社区的信息检索算法设计P2P社区的信息检索算法设计
  • 一种P2P系统节点聚类及信息检索算法.pdf
  • 一种面向海量实时数据的信息检索算法 丁伟 林容熔 倪良胜 南京东南大学计算机科学与工程系
  • 关于p2p检索一篇论文。中南大学的论文,提出节点聚类和信息检索算法
  • 机器智能-高频问题-无信息搜索算法

    千次阅读 2020-03-08 21:31:47
    首先,解释一下名词,什么是“树搜索算法”?...还有一个名词,什么是“无信息搜索策略”? 除了问题定义中提供的状态信息外没有任何附加信息,算法只能区分状态是不是目标状态,而无法比较非目标状态的好坏(即...

    首先,解释一下名词,什么是“树搜索算法”?

    树搜索算法并不是特指一个算法,而是指一类基于树结构的搜索算法(如深度优先和广度优先等)

    当然,还有一个名词,什么是“图搜索算法”?

    图搜索不会重复搜索节点,树搜索允许重复搜索节点。图搜索是特殊的树搜索。

    还有一个名词,什么是“无信息搜索策略”?

    除了问题定义中提供的状态信息外没有任何附加信息,算法只能区分状态是不是目标状态,而无法比较非目标状态的好坏(即不知道是否靠近目标状态)
    简单地讲,就是说,我不知道目标在哪里,我只知道我现在有没有到目标。

    下面是几个比较经典的无信息搜索策略

    宽度优先搜索

    算法理念是一个先进先出的队列,先扩展根结点,再扩展根结点的所有后继,然后再扩展它们的后继。然后在每一个节点入队的时候判定当前节点是否是目标节点(之所以在入队的时候是为了减少节点数从而节省时间)。
    实际上,和广度优先搜索一样,都是一层一层向下找。
    由于能够找完所有的节点,所以结果必定是最优的

    一致代价搜索

    算法理念是扩展未扩展节点中代价最小的,这个代价是真实值。队列按照代价从小到大排列;代价小的先出队,代价大的后出队。出队时做目标检测;因为入队时不能保证是最优的,但出队时可以。
    这里的代价和上文是不冲突的,他记录的是我目前已经走了多远了。实际上就是一个广度优先搜索和贪心算法的结合体,在一层一层向下找的时候,决定了节点的顺序,比方说有多个子节点的时候,哪一个子节点先入队。
    这里解释一下为什么要出队的时候才进行目标检测,而入队的时候不行。因为入队的时候并没有进行排列,也就是说,这个时候我或许到达了目标,但是我的队列里面还隐藏着另一条路径,可以比我当前的路径更短
    换句话说,我们可能像大禹一样,路过目标好几次,但只有走完了所有的路(极限情况)之后,才知道那条路是最近的。

    深度优先搜索

    首先扩展最深的为扩展节点,用LIFO队列来存储节点。
    说白了,就是DFS,同名的深度优先搜索,当然结果不一定是最优的(深度有限的时候是最优的),这个的空间复杂度很小。
    简单地讲,就是一条路走到黑,一直左拐一直左拐的感觉

    深度受限搜索

    前文说到,深度优先搜索在深度有限的时候是最优的,所以这里就有了深度受限搜索,实际上就是设定一个最大深度dmax,当搜索深度大于dmax的时候立即回溯,从而避免了在无穷状态空间中陷入深度无限的分支。
    即一开始有一个深度限制,每深入一层减一,减到0为止

    迭代加深的深度优先搜索

    这个名字是不是特别长?实际上很简单,就是一个不断加深深度的深度优先搜索
    不断加深深度,每一次都从根节点开始调用深度优先探索。

    展开全文
  • 信息搜索算法

    2012-11-10 20:11:44
    信息学竞赛中, 搜索算法是一种很重要的算法,我们对它进行了深入的研究。
  • 以分布式视频解码为基础,利用全搜索边信息...介绍视频监控系统的结构,探讨边信息搜索算法中的搜索范围、子块运动矢量等具体内容,并将此种算法应用于实际煤矿视频处理中,仿真结果显示该算法信噪比高,视频处理效果好。
  • 一种改进的信息检索排序算法 .
  • 智能优化算法:麻雀搜索算法-附代码

    万次阅读 多人点赞 2020-09-27 16:34:00
    2020智能优化算法:麻雀搜索算法-附代码 文章目录2020智能优化算法:麻雀搜索算法-附代码1.算法原理2.算法结果3.参考文献4.Matlab代码 摘要:麻雀搜索算法(Sparrow Search Algorithm, SSA)是于2020年提出的。SSA ...

    2020智能优化算法:麻雀搜索算法


    摘要:麻雀搜索算法(Sparrow Search Algorithm, SSA)是于2020年提出的。SSA 主要是受麻雀的觅食行为和反捕食行为的启发而提出的。该算法比较新颖,具有寻优能力强,收敛速度快的优点

    1.算法原理

    建立麻雀搜索算法的数学模型,主要规则如下所述:

    1. 发现者通常拥有较高的能源储备并且在整个种群中负责搜索到具有丰富食物的区域,为所有的加入者提供觅食的区域和方向。在模型建立中能量储备的高低取决于麻雀个体所对应的适应度值(Fitness Value)的好坏。
    2. 一旦麻雀发现了捕食者,个体开始发出鸣叫作为报警信号。当报警值大于安全值时,发现者会将加入者带到其它安全区域进行觅食。
    3. 发现者和加入者的身份是动态变化的。只要能够寻找到更好的食物来源,每只麻雀都可以成为发现者,但是发现者和加入者所占整个种群数量的比重是不变的。也就是说,有一只麻雀变成发现者必然有另一只麻雀变成加入者。
    4. 加入者的能量越低,它们在整个种群中所处的觅食位置就越差。一些饥肠辘辘的加入者更有可能飞往其它地方觅食,以获得更多的能量。
    5. 在觅食过程中,加入者总是能够搜索到提供最好食物的发现者,然后从最好的食物中获取食物或者在该发现者周围觅食。与此同时,一些加入者为了增加自己的捕食率可能会不断地监控发现者进而去争夺食物资源。
    6. 当意识到危险时,群体边缘的麻雀会迅速向安全区域移动,以获得更好的位置,位于种群中间的麻雀则会随机走动,以靠近其它麻雀。

    在模拟实验中,我们需要使用虚拟麻雀进行食物的寻找,由n只麻雀组成的种群可表示为如下形式:
    X = [ x 1 1 x 1 2 . . . x 1 d x 2 1 x 2 2 . . . x 2 d . . . . . . . . . . . . x n 1 x n 2 . . . x n d ] (1) X=\left[\begin{matrix} x_1^1&x_1^2&...&x_1^d\\ x_2^1&x_2^2&...&x_2^d\\ ...&...&...&... \\ x_n^1&x_n^2&...&x_n^d\\ \end{matrix}\right]\tag{1} X=x11x21...xn1x12x22...xn2............x1dx2d...xnd(1)
    其中, d d d 表示待优化问题变量的维数, n n n 则是麻雀的数量。那么,所有麻雀的适应度值可以表示为如下形式:
    F x = [ f ( [ x 1 1 x 1 2 . . . x 1 d ] ) f ( [ x 2 1 x 2 2 . . . x 2 d ] ) . . . f ( [ x n 1 x n 2 . . . x n d ] ) ] (2) F_x =\left[\begin{matrix} f([x_1^1&x_1^2&...&x_1^d])\\ f([x_2^1&x_2^2&...&x_2^d])\\ ... f([x_n^1&x_n^2&...&x_n^d]) \end{matrix}\right]\tag{2} Fx=f([x11f([x21...f([xn1x12x22xn2.........x1d])x2d])xnd])(2)
    其中,f 表示适应度值。

    在 SSA 中,具有较好适应度值的发现者在搜索过程中会优先获取食物。此外,因为发现者负责为整个麻雀种群寻找食物并为所有加入者提供觅食的方向。因此,发现者可以获得比加入者更大的觅食搜索范围。根据规则(1)和规则(2),在每次迭代的过程中,发现者的位置更新描述如下:
    X i , j t + 1 = { X i , j . e x p ( − i α . i t e r m a x ) , i f   R 2 < S T X i , j + Q . L , i f   R 2 ≥ S T (3) X_{i,j}^{t+1}=\begin{cases} X_{i,j}.exp(-\frac{i}{\alpha.iter_{max}}),if\, R_2<ST\\ X_{i,j} + Q.L,if\, R_2\geq ST \end{cases}\tag{3} Xi,jt+1={Xi,j.exp(α.itermaxi),ifR2<STXi,j+Q.L,ifR2ST(3)
    其中, t t t 代表当前迭代数, j = 1 , 2 , 3 , . . . , d j =1, 2, 3, . . . , d j=1,2,3,...,d i t e m m a x item_{max} itemmax
    是一个常数,表示最大的迭代次数。 X i j X_{ij} Xij表示第 i i i 个麻雀在第 j j j 维中的位置信息。 α ∈ ( 0 , 1 ] α∈(0, 1] α(0,1]是一个随机数。 R 2 ( R 2 ∈ [ 0 , 1 ] ) R_2(R_2∈[0,1]) R2(R2[0,1]) S T ( S T ∈ [ 0.5 , 1 ] ) ST(ST∈[0.5,1]) ST(ST[0.5,1])分别表示预警值和安全值。 Q Q Q 是服从正态分布的随机数。 L L L 表示一个 1 × d 1×d 1×d 的矩阵,其中该矩阵内每个元素全部为 1。

    R 2 < S T R2< ST R2<ST 时,这意味着此时的觅食环境周围没有捕食者,发现者可以执行广泛的搜索操作。如果 R 2 ≥ S T R2≥ ST R2ST,这表示种群中的一些麻雀已经发现了捕食者,并向种群中其它麻雀发出了警报,此时所有麻雀都需要迅速飞到其它安全的地方进行觅食。

    对于加入者,它们需要执行规则(3)和规则(4)。如前面所描述,在觅食过程中,一些加入者会时刻监视着发现者。一旦它们察觉到发现者已经找到了更好的食物,它们会立即离开现在的位置去争夺食物。如果它们赢了,它们可以立即获得该发现者的食物,否则需要继续执行规则(4)。加入者的位置更新描述如下:
    X i , j t + 1 = { Q . e x p ( X w o r s t − X i , j t i 2 ) , i f   i > n / 2 X P t + 1 + ∣ X i , j − X P t + 1 ∣ . A + . L , o t h e r w i s e (4) X_{i,j}^{t+1}=\begin{cases} Q.exp(\frac{X_{worst}-X_{i,j}^t}{i^2}),if\, i>n/2\\ X_P^{t+1}+ |X_{i,j} - X_P^{t+1}|.A^{+}.L,otherwise \end{cases}\tag{4} Xi,jt+1={Q.exp(i2XworstXi,jt),ifi>n/2XPt+1+Xi,jXPt+1.A+.L,otherwise(4)
    其中, X p X_p Xp是目前发现者所占据的最优位置, X w o r s t X_{worst} Xworst则表示当前全局最差的位置。 A A A表示一个 1 × d 1×d 1×d 的矩阵,其中每个元素随机赋值为 1 或-1,并且 A + = A T ( A A T ) − 1 A^+=A^T(AA^T)^{-1} A+=AT(AAT)1。当i >n/2 时,这表明,适应度值较低的第 i 个加入者没有获得食物,处于十分饥饿的状态,此时需要飞往其它地方觅食,以获得更多的能量。

    在模拟实验中,我们假设这些意识到危险的麻雀占总数量的 10% 到 20%。这些麻雀的初始位置是在种群中随机产生的。根据规则(5),其数学表达式可以表示为如下形式:
    X i , j t + 1 = { X b e s t t + β . ∣ X i , j t − X b e s t t ∣ , i f   f i > f g X i , j t + K . ( ∣ X i , j t − X w o r s t t ∣ ( f i − f w ) + ε ) , i f   f i = f g (5) X_{i,j}^{t+1}=\begin{cases} X_{best}^t + \beta.|X_{i,j}^t - X_{best}^t|,if\, f_i>f_g\\ X_{i,j}^t + K.(\frac{|X_{i,j}^t - X_{worst}^t|}{(f_i -f_w)+\varepsilon}), if\, f_i =f_g \end{cases}\tag{5} Xi,jt+1={Xbestt+β.Xi,jtXbestt,iffi>fgXi,jt+K.((fifw)+εXi,jtXworstt),iffi=fg(5)
    其中,其中 X b e s t X_{best} Xbest是当前的全局最优位置。 β β β 作为步长控制参数,是服从均值为 0,方差为 1 的正态分布的随机数。 K ∈ [ − 1 , 1 ] K∈[-1,1] K[1,1]是一个随机数,fi则是当前麻雀个体的适应度值。 f g f_g fg f w f_w fw分别是当前全局最佳和最差的适应度值。 ε \varepsilon ε 的常数,以避免分母出现零。

    为简单起见,当 f i > f g f_i >f_g fi>fg表示此时的麻雀正处于种群的边缘,极其容易受到捕食者的攻击。 X b e s t X_{best} Xbest表示这个位置的麻雀是种群中最好的位置也是十分安全的。 f i = f g f_i = f_g fi=fg时,这表明处于种群中间的麻雀意识到了危险,需要靠近其它的麻雀以此尽量减少它们被捕食的风险。 K K K 表示麻雀移动的方向同时也是步长控制参数。

    算法流程

    Step1: 初始化种群,迭代次数,初始化捕食者和加入者比列。

    Step2:计算适应度值,并排序。

    Step3:利用式(3)更新捕食者位置。

    Step4:利用式(4)更新加入者位置。

    Step5:利用式(5)更新警戒者位置。

    Step6:计算适应度值并更新麻雀位置。

    Step7:是否满足停止条件,满足则退出,输出结果,否则,重复执行Step2-6;

    2.算法结果

    在这里插入图片描述

    3.参考文献

    [1] Xue J , Shen B . A novel swarm intelligence optimization approach: sparrow search algorithm[J]. Systems ence & Control Engineering An Open Access Journal, 2020, 8(1):22-34.

    4.Matlab代码

    麻雀搜索算法
    改进算法:
    1.基于反向策略的麻雀搜索算法
    2.基于Tent混沌映射的麻雀搜索算法
    3.基于Logistic混沌映射的麻雀搜索算法
    4.基于Circle混沌映射的麻雀搜索算法
    5.基于Piecewise混沌映射的麻雀搜索算法
    6.基于Chebyshev混沌映射的麻雀搜索算法
    7.基于Sine混沌映射的麻雀搜索算法
    8.基于Singer混沌映射的麻雀搜索算法
    9.基于迭代混沌映射的麻雀搜索算法
    10.基于Sinusoidal混沌映射的麻雀搜索算法
    11.基于随机游走改进的麻雀搜索算法
    12.基于萤火虫改进的麻雀搜索算法
    13.基于精英反向策略的麻雀搜索算法1
    14.基于levy飞行改进的麻雀搜索算法
    15.基于自适应t分布的麻雀算法

    改进麻雀文献复现代码:
    1.混沌麻雀。
    参考文献:[1]吕鑫,慕晓冬,张钧,王震.混沌麻雀搜索优化算法[J/OL].北京航空航天大学学报:1-10[2020-11-16].https://doi.org/10.13700/j.bh.1001-5965.2020.0298.

    2.融合柯西变异和反向学习的改进麻雀算法
    [1]毛清华,张强.融合柯西变异和反向学习的改进麻雀算法[J/OL].计算机科学与探索:1-12[2020-12-16].http://kns.cnki.net/kcms/detail/11.5602.tp.20201203.1601.006.html.
    3.混合正弦余弦算法和Lévy飞行的麻雀算法(ISSA)
    [1]毛清华,张强,毛承成,柏嘉旋.混合正弦余弦算法和Lévy飞行的麻雀算法[J/OL].山西大学学报(自然科学版):1-6[2021-04-09].https://doi.org/10.13451/j.sxu.ns.2020135.
    4.基于 Sobol 序列和纵横交叉策略的麻雀搜索算法(SSASC)
    [1]段玉先,刘昌云.基于 Sobol 序列和纵横交叉策略的麻雀搜索算法[J/OL].计算机应用. https://kns.cnki.net/kcms/detail/51.1307.TP.20210525.1453.002.html
    5.混合策略改进的麻雀搜索算法(MSSA)
    [1]张伟康,刘升,任春慧.混合策略改进的麻雀搜索算法[J/OL].计算机工程与应用:1-12[2021-08-05].http://kns.cnki.net/kcms/detail/11.2127.TP.20210721.0848.002.html.

    5.Python代码

    麻雀搜索算法
    改进算法:
    基于Sinusoidal混沌映射的麻雀搜索算法 python 代码
    基于迭代混沌映射的麻雀搜索算法 python 代码
    基于Singer混沌映射的麻雀搜索算法 python 代码
    基于Sine混沌映射的麻雀搜索算法 python代码
    基于Piecewise混沌映射的麻雀搜索算法 python代码
    基于Logistic混沌映射的麻雀搜索算法 python 代码
    基于Circle混沌映射的麻雀搜索算法 python 代码
    基于Chebyshev混沌映射的麻雀搜索算法 python代码
    基于Tent混沌映射的麻雀搜索算法 python代码
    基于反向策略的麻雀搜索算法 python代码
    基于精英反向策略的麻雀搜索算法1 python代码
    基于精英反向策略的麻雀搜索算法2 python 代码
    基于萤火虫改进的麻雀搜索算法 python代码
    基于levy飞行改进的麻雀搜索算法 python 代码
    基于随机游走改进的麻雀搜索算法
    基于自适应t分布的麻雀搜索算法

    改进麻雀文献复现代码:
    1.混沌麻雀
    参考文献:[1]吕鑫,慕晓冬,张钧,王震.混沌麻雀搜索优化算法[J/OL].北京航空航天大学学报:1-10[2020-11-16].https://doi.org/10.13700/j.bh.1001-5965.2020.0298.

    2.混合正弦余弦算法和Lévy飞行的麻雀算法(ISSA)
    [1]毛清华,张强,毛承成,柏嘉旋.混合正弦余弦算法和Lévy飞行的麻雀算法[J/OL].山西大学学报(自然科学版):1-6[2021-04-09].https://doi.org/10.13451/j.sxu.ns.2020135.

    上述代码见个人资料介绍

    展开全文
  • 面向信息检索的快速聚类算法.pdf
  • 一种利用局部结构信息的加权哈希图像检索算法
  • 全文信息检索介绍及算法分析.pdf
  • 遗传算法信息检索中的应用,硕士论文遗传算法信息检索中的应用,硕士论文
  • 信息检索课件,从信息检索入门,相关继续,讲到信息检索模型、各个模型的核心算法信息检索模型的评判准则等。
  • 广度优先搜索算法

    万次阅读 多人点赞 2019-04-25 13:26:58
    广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验...

    一、简介

    广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。

    广度优先搜索让你能够找出两样东西之间的最短距离,不过最短距离的含义有很多!使用广度优先搜索可以:

    1. 编写国际跳棋AI,计算最少走多少步就可获胜;
    2. 编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将READED改为READER需要编辑一个地方;
    3. 根据你的人际关系网络找到关系最近的医生。

    二、例子

    假设你居住在旧金山,要从双子峰前往金门大桥。你想乘公交车前往,并希望换乘最少。可乘坐的公交车如下。

    为找出换乘最少的乘车路线,你将使用什么样的算法?
    一步就能到达金门大桥吗?下面突出了所有一步就能到达的地方。

    金门大桥未突出,因此一步无法到达那里。两步能吗?

    金门大桥也未突出,因此两步也到不了。三步呢?

    金门大桥突出了!因此从双子峰出发,可沿下面的路线三步到达金门大桥。

     还有其他前往金门大桥的路线,但它们更远(需要四步)。这个算法发现,前往金门大桥的最短路径需要三步。这种问题被称为最短路径问题(shorterst-path problem)。你经常要找出最短路径,这可能是前往朋友家的最短路径,也可能是国际象棋中把对方将死的最少步数。解决最短路径问题的算法被称为广度优先搜索。要确定如何从双子峰前往金门大桥,需要两个步骤。
    (1) 使用图来建立问题模型。
    (2) 使用广度优先搜索解决问题。
    下面介绍什么是图,然后再详细探讨广度优先搜索。

    三、图

    图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合。

    无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示。

    对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D};边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}:

    有向图:若从顶点Vi到Vj的边是有方向的,则成这条边为有向边,也称为弧(Arc)。用有序对(Vi,Vj)标示,Vi称为弧尾,Vj称为弧头。如果任意两条边之间都是有向的,则称该图为有向图。

    有向图G2中,G2=(V2,{E2}),顶点集合(A,B,C,D),弧集合E2={<A,D>,{B,A},<C,A>,<B,C>}.

    权:有些图的边和弧有相关的数,这个数叫做权。这些带权的图通常称为网。

    四、广度优先搜索算法

    假设你经营着一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。在Facebook,你与芒果销售商有联系吗?为此,你可在朋友中查找。

    这种查找很简单。首先,创建一个朋友名单。

     然后,依次检查名单中的每个人,看看他是否是芒果销售商。

     假设你没有朋友是芒果销售商,那么你就必须在朋友的朋友中查找。

     检查名单中的每个人时,你都将其朋友加入名单。

     这样一来,你不仅在朋友中查找,还在朋友的朋友中查找。别忘了,你的目标是在你的人际关系网中找到一位芒果销售商。因此,如果Alice不是芒果销售商,就将其朋友也加入到名单中。这意味着你将在她的朋友、朋友的朋友等中查找。使用这种算法将搜遍你的整个人际关系网,直到找到芒果销售商。这就是广度优先搜索算法。

    五、查找最短路径

    再说一次,广度优先搜索可回答两类问题。
    第一类问题:从节点A出发,有前往节点B的路径吗?(在你的人际关系网中,有芒果销售商吗?)
    第二类问题:从节点A出发,前往节点B的哪条路径最短?(哪个芒果销售商与你的关系最近?)
    刚才你看到了如何回答第一类问题,下面来尝试回答第二类问题——谁是关系最近的芒果销售商。例如,朋友是一度关系,朋友的朋友是二度关系。

     在你看来,一度关系胜过二度关系,二度关系胜过三度关系,以此类推。因此,你应先在一度关系中搜索,确定其中没有芒果销售商后,才在二度关系中搜索。广度优先搜索就是这样做的!在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再检查二度关系。顺便问一句:将先检查Claire还是Anuj呢?Claire是一度关系,而Anuj是二度关系,因
    此将先检查Claire,后检查Anuj。

    你也可以这样看,一度关系在二度关系之前加入查找名单。

    你按顺序依次检查名单中的每个人,看看他是否是芒果销售商。这将先在一度关系中查找,再在二度关系中查找,因此找到的是关系最近的芒果销售商。广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。

     注意,只有按添加顺序查找时,才能实现这样的目的。换句话说,如果Claire先于Anuj加入名单,就需要先检查Claire,再检查Anuj。如果Claire和Anuj都是芒果销售商,而你先检查Anuj再检查Claire,结果将如何呢?找到的芒果销售商并非是与你关系最近的,因为Anuj是你朋友的朋友,而Claire是你的朋友。因此,你需要按添加顺序进行检查。有一个可实现这种目的的数据
    结构,那就是队列(queue)。

    六、队列

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

    队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

    顺序队列

    建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置,如图所示

    每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。当front=rear时,队列中没有任何元素,称为空队列。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元。

    顺序队列中的溢出现象:

    (1) "下溢"现象:当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

    (2)"真上溢"现象:当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。

    (3)"假上溢"现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

    循环队列

    在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。自己真从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除了一些简单应用之外,真正实用的队列是循环队列。 [2] 

    在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。队空和队满的情况如图:

    七、广度优先搜索算法实现

    我们要从“你”出发找到“ANUJ”,关系表示为下图,使用广度优先搜索算法

     先概述一下这种算法的工作原理。

    但这样可能会出现一些问题,Peggy既是Alice的朋友又是Bob的朋友,因此她将被加入队列两次:一次是在添加Alice的朋友时,另一次是在添加Bob的朋友时。因此,搜索队列将包含两个Peggy。

    但你只需检查Peggy一次,看她是不是芒果销售商。如果你检查两次,就做了无用功。因此,检查完一个人后,应将其标记为已检查,且不再检查他。
    如果不这样做,就可能会导致无限循环。假设你的人际关系网类似于下面这样。

    一开始,搜索队列包含你的所有邻居。

    现在你检查Peggy。她不是芒果销售商,因此你将其所有邻居都加入搜索队列。

    接下来,你检查自己。你不是芒果销售商,因此你将你的所有邻居都加入搜索队列。

    以此类推。这将形成无限循环,因为搜索队列将在包含你和包含Peggy之间反复切换。

    检查一个人之前,要确认之前没检查过他,这很重要。为此,你可使用一个列表来记录检查过的人。

    首先,需要使用代码来实现图。图由多个节点组成。
    每个节点都与邻近节点相连,如果表示类似于“你→Bob”这样的关系呢?好在你知道的一种结构让你能够表示这种关系,它就是散列表!
    记住,散列表让你能够将键映射到值。在这里,你要将节点映射到其所有邻居。

    图不过是一系列的节点和边,因此在JAVA中,你可以使用HashMap来表示一个图。

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.concurrent.LinkedBlockingQueue;
    
    public class BFS {
    
    
        public static void main(String[] args) {
            HashMap<String,String[]> hashMap=new HashMap<>();
            hashMap.put("YOU",new String[]{"CLAIRE","ALICE","BOB"});
            hashMap.put("CLAIRE",new String[]{"YOU","JONNY","THON"});
            hashMap.put("JONNY",new String[]{"CLAIRE"});
            hashMap.put("THOH",new String[]{"CLAIRE"});
            hashMap.put("ALICE",new String[]{"YOU","PEGGY"});
            hashMap.put("BOB",new String[]{"YOU","PEGGY","ANUJ"});
            hashMap.put("PEGGY",new String[]{"BOB","ALICE"});
            hashMap.put("ANUJ",new String[]{"BOB"});
            Node target = findTarget("YOU","ANUJ",hashMap);
            //打印出最短路径的各个节点信息
            printSearPath(target);
        }
    
        /**
         * 打印出到达节点target所经过的各个节点信息
         * @param target
         */
        static void printSearPath(Node target) {
            if (target != null) {
                System.out.print("找到了目标节点:" + target.id + "\n");
    
                List<Node> searchPath = new ArrayList<Node>();
                searchPath.add(target);
                Node node = target.parent;
                while(node!=null) {
                    searchPath.add(node);
                    node = node.parent;
                }
                String path = "";
                for(int i=searchPath.size()-1;i>=0;i--) {
                    path += searchPath.get(i).id;
                    if(i!=0) {
                        path += "-->";
                    }
                }
                System.out.print("步数最短:"+path);
            } else {
                System.out.print("未找到了目标节点");
            }
        }
    
        static Node findTarget(String startId,String targetId,HashMap<String,String[]> map) {
            List<String> hasSearchList = new ArrayList<String>();
            LinkedBlockingQueue<Node> queue=new LinkedBlockingQueue<>();
            queue.offer(new Node(startId,null));
            while(!queue.isEmpty()) {
                Node node = queue.poll();
                if(hasSearchList.contains(node.id)) {
                    continue;
                }
                System.out.print("判断节点:" + node.id +"\n");
                if (targetId.equals(node.id)) {
                    return node;
                }
                hasSearchList.add(node.id);
                if (map.get(node.id) != null && map.get(node.id).length > 0) {
                    for (String childId : map.get(node.id)) {
                        queue.offer(new Node(childId,node));
                    }
                }
            }
            return null;
        }
    
        static class Node{
            public String id;
            public Node parent;
            public Node(String id,Node parent) {
                this.id = id;
                this.parent = parent;
            }
        }
    }

    运行时间

    如果你在你的整个人际关系网中搜索芒果销售商,就意味着你将沿每条边前行(记住,边是从一个人到另一个人的箭头或连接),因此运行时间至少为O(边数)。
    你还使用了一个队列,其中包含要检查的每个人。将一个人添加到队列需要的时间是固定的,即为O(1),因此对每个人都这样做需要的总时间为O(人数)。所以,广度优先搜索的运行时间为O(人数 + 边数),这通常写作O(V + E),其中V为顶点(vertice)数,E为边数。

    展开全文
  • 针对视频检索过程中存在的视频亮度整体漂移、突变干扰以及视频再编辑等问题,提出了一种融合视频指纹特征和关键帧密度的检索算法.该算法首先对视频帧进行区域分割提取视频指纹特征;其次,采用改进的直接时序算法...
  • 搜索算法

    千次阅读 2018-07-10 19:47:51
    搜索最小值设计一个简单的找寻最小的算法:该算法首先是将列表中的第一个值作为最小项,然后向右搜索以找到一个更小的值,如果找到了就将最小项的位置设置为当前的位置。当这个算法到达列表的最右端的时候,它就将...

    搜索最小值

    设计一个简单的找寻最小的算法:

    该算法首先是将列表中的第一个值作为最小项,然后向右搜索以找到一个更小的值,如果找到了就将最小项的位置设置为当前的位置。当这个算法到达列表的最右端的时候,它就将返回最小项的位置。

    开发以下的indexOfMin函数:

    def indexOfMin(lyst):
    	"""返回最小项的索引"""
    	minIndex=0
    	currentIndex=0
    	while currentIndex<len(lyst):
    		if lyst[currentIndex]<lyst[minIndex]:
    			minIndex=currentIndex
    			pass
    		currentIndex+=1
    	return minIndex
    
    if __name__=="__main__":
    	index=indexOfMin([1,2,3])
    	print(index)
    	pass

    以上程序的返回值为0

    算法的复杂度分析

    函数里面,循环的外面,有三条指令返回相同的次数,而不管列表的大小是多少。因此可以不用考虑他们。在循环之中,还有三条指令,包括if语句中比较,以及在每一次的循环过程中所执行的currentIndex的递增。这个算法必须访问列表中的每一项,以确保它找到了最小项的位置,因此,对于问题大小为n的列表,该算法必须进行n-1次的比较。因此算法的复杂度为O(n),线性阶




    顺序搜索一个列表

    python中的in运算作为list类中名为__contains__的一个方法而实现。这个方法在列表中(任意排列的项)中搜索一个特定的项(叫做目标项)。在这样的一个列表中搜索一个目标项的唯一方法是:

    从第一个位置的项开始,将其于于目标项进行比较。如果存在两个两个项是相等的,则返回True,否则移动到下一个位置,继续比较,到达最后的一个位置时,仍然没有找到目标项,返回false。这种搜索算法叫做顺序搜索(sequential search)或者线性搜索(linear search)。


    一个更为有效的顺序搜索算法,应该返回它所找到的目标项的index,如果没有找到的话,返回-1.

    如下是一个顺序搜索函数的python代码:

    def sequentialSearch(target,lyst):
    	"""返回一个lyst列表中是否存在target的项,若是返回index,否返回-1"""
    	position=0
    	while position<len(lyst):
    		if target==lyst[position]:
    			return position
    		position+=1
    	return -1

    最好情况、最坏情况和平均情况的性能

    有些算法性能取决于所处理数据的放置方式。顺序搜索算法在查找一个目标项的时候,在列表的开头所做的工作比在列表的末尾所做的工作要少。对于这样的算法,我们可以确定其最好情况的性能、最坏情况的性能和平均情况的性能。


    通常建议更多的思考平均情况的性能和最坏情况的性能,而不是最好的情况的性能。


    顺序搜索的分析主要考虑如下的三种情况:

    1、在最坏的情况下,目标项位于列表的末尾时,或者根本不在列表之中。那么,算法必须访问每一个项,并且对大小为n 的列表要执行n-1次。因此顺序搜索的最坏情况的复杂度是O(n)

    2、在最好的情况下,算法只是进行来一次,复杂度为O(1)

    3、确定平均情况,把在每一个可能的位置找到目标的迭代次数相加,并且用总和除以n。因此算法执行了(n+n-1+n-2……+1)/n次的迭代。对于很大的n,可知平均情况下的复杂度仍然为O(n)

    比较发现,顺序搜索的最好的性能的情况是很少见的,而对于平均情况和最坏的情况的性能是基本相同的。


    有序列表的二叉搜索

    对于那些没有按照任何特定的顺序排列的数据,顺序搜索是必要的。当搜索排序的数据的时候。可以使用二叉搜索(二分搜索)


    考虑使用python实现二叉搜索的一个实例,首先假设list中的item是按照升序的顺序排列的。搜索算法直接找到list中间的位置,如果该位置的项和目标项是相等的,算法返回该位置。否则如果目标项小于当前的项,则搜索前面的项,否则就是后面的item。结束的条件是找到目标或者当前的结束位置比当前的开始位置大的时候,停止搜索。

    定义以下的函数:

    def binarySearch(target,sortedLyst):
    	"""二叉搜索函数,若是找到就是index,否则就是-1"""
    	left=0
    	right=len(sortedLyst)-1
    	while left<=right:
    		minPoint=(left+right)//2
    		if target==sortedLyst[minPoint]:
    			return minPoint
    		elif target<sortedLyst[minPoint]:
    			right=minPoint-1
    		else:
    			left=minPoint+1
    	return -1

    以上的代码中只有一个循环,而且没有嵌套的或者隐藏的循环,当目标不在list中的时候,会发生最坏的情况。最坏的情况下的循环次数的计算方法是等于列表的大小除以2一直到得到商为1 的次数。对于大小为n的list,实际上的执行次数为n/2/2/2/2的连续除法,直到结果为1,假设k是用n除以2的次数。要求解k,让2^k=1,得到k=log2 n。所以二叉搜索的最坏的情况的复杂度为O(log2 n)

    二叉搜索要比顺序搜索更加的有效,但是这还得根据list中的数据的组织方式。对于二叉搜索有一个额外的整体性的代价,就是必须保证list是有序的。



    展开全文
  • 针对基本引力搜索算法搜索速度慢和容易出现早熟的缺点,提出了一种基于信息熵的混合引力搜索算法。受粒子群算法的启发,所提算法通过改进基本引力搜索算法的速度和位置更新式来提高搜索速度;通过惯性质量构造了信息...
  • 信息检索分类系统中过滤推荐算法研究.pdf
  • 在现代中文信息检索系统中,用户输入的字符串和实际数据库中的条目往往存在局部偏差,而基于关键词 匹配的检索技术不能很好地...出的算法能有效提高中文信息检索系统的召回率,在实际应用中可达到“子线性”的效率。
  • 在介绍目前信息检索中流行的逻辑运算算法基础上,着重研究了双对分算法的原理,指出其存在的不足,提出了双向双对分算法.该算法在每个运算周期中,通过比较基于升序排列的数组头尾元素确定新的被比较数组,从而简化数组...
  • 信息检索中的经典算法——BM25

    千次阅读 热门讨论 2010-10-25 23:00:00
    BM25(Best Match25)是在信息检索系统中根据提出的query对document进行评分的算法。它主要由Stephen E. Robertson, Karen Spärck Jones等人在上世纪70到80年代提出。BM25算法首先由Okapi系统实现(Okapi是伦敦城市...
  • 现阶段搜索算法一般有深度/广度优先搜索、枚举算法、A-Star算法、蒙特卡洛树搜索等,目前众多的搜索算法都从以下几个方面来降低搜索的时间和复杂性; 1、搜索前根据条件降低搜索规模 2、根据问题的约束条件进行...
  • 现代优化算法 之 禁忌搜索算法

    万次阅读 多人点赞 2015-12-22 12:45:02
    这次是首次接触这个算法,看了一些资料,...禁忌搜索算法用一个禁忌表记录下已经到达过的局部最优点,在下一次搜索中,利用禁忌表中的信息不再或有选择地搜索这些点。禁忌搜索算法实现的技术问题是算法的关键。禁忌搜
  • 禁忌搜索算法详解

    万次阅读 多人点赞 2017-01-08 17:47:43
    禁忌搜索是由局部搜索算法发展而来,爬山法是从通用局部搜索算法改进而来。在介绍禁忌搜索之前先来熟悉下爬山法和局部搜索算法。 局部搜索算法 算法的基本思想 在搜索过程中,始终选择当前点的邻居中与离目标...
  •  针对传统元数据检索过程中的效率低问题,提出了基于多...通过本文研究表明,将多维度作为基础的元数据检索算法能够为用户提供高效可持续发展元数据搜索,并大大提升可持续发展信息共享系统的数据共享服务能力。
  • 全文信息检索介绍及算法分析

    千次阅读 2007-06-07 02:52:00
    全文信息检索介绍及算法分析作者:杨老师 一、摘要 本文主要介绍了全文信息检索的概念、应用领域、算法分类、技术难点和算法比较。及一款实现全文检索的数据结构和算法。 二、什么是全文数据库和全文信息检索 保存...
  • 智能优化算法:天牛须搜索算法

    千次阅读 多人点赞 2020-11-23 16:51:25
    智能优化算法:天牛须搜索算法一、前言二、算法简介三、算法原理3.1 算法模型3.2 算法流程总结 一、前言        天牛须算法 (Beetle Antennae search algorithm, BAS) 是由Jiang...
  • 这些优化算法都是为针对一个目标值的最大或最小的寻找,前三种算法都属于概率性原理的算法(区别于工程优化里面的梯度下降,牛顿算法等连续直接的搜索算法,可以参考我这篇文章,求多元函数极值的情况分类与对应的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 395,785
精华内容 158,314
关键字:

信息搜索算法