总结搜索专题

来源:互联网 发布:垂直搜索引擎 知乎 编辑:程序博客网 时间:2024/05/24 06:38
在这段时间里,我学到了几种基本的搜索算法,包括:二分查找算法,三分搜索算法,深度优先搜索算法,广度优先算法,此外还有记忆化搜索,双向搜索,优先队列与搜索方法的结合。以后再补上。

主要思想:前两者主要应用于数学公式,后两者应用于地图或图形的模式。

1 二分算法:

在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标解。它主要应用于单调函数给定一个因变量,求解自变量问题,取中点函数值num[mid]与X比较。

模板代码:int mid,LOW,high;

//x:待查找的元素, n:数组集合大小, num数组单调递增(或递减)

    int low=0,high=n,mid;    //low:集合下界 high:集合上节
    while(low<=high)                    
    {
        mid=(low+high)/2;             //mid:将集合分割为两部分
        if(num[mid]==x)              //查找到符合元素x
        {
           return mid;
    break;           
        }       
        else if(num[mid]<x)           //x在右边部分,调整集合下界
           low=mid;
        else               //x在左边部分,调整集合上界
           high=mid;
    }

2 三分算法:

当需要求某凸性或凹形函数的极值,通过函数本身表达式并不容易求解时,就可以用三分法不断逼近求解、

先取mid=L+R,mmid=mid+R,再通过F(mid)与F(mmid)谁离函数机智点近进行比较,不断逼近极值点、

代码实现:

double mid, midmid;//cal()函数假设先增后减double mid, midmid;
while ( low + eps < high )
{
    mid = (low + high) / 2;
    midmid = (mid + high ) / 2;
    double cmid = cal(mid);
    double cmidmid = cal(midmid);
    if ( cmid > cmidmid )
      high = midmid;
    else
        low = mid;
}

深度优先算法:(通过遍历子状态路径来寻求最优解)

1. 访问顶点v;

2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;

3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止、
基本思想:
    从初始状态,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。
递归实现:
Function Dfs (Int Step, 当前状态)
Begin
可加结束条件
从当前状态循环拓展下一个状态Next
If 状态Next合法 Then
Dfs (Step + 1, Next ))
End
非递归实现:
While Not Stack.Empty ()
Begin
Tmp = Stack.top()
从Tmp拓展下一个未拓展的状态Next
If 没有未拓展状态(到达叶节点) Then
Stack.pop()
Else If 状态Next合法 Then
Stack.push(Next)
End
广度优先:(由于广度优先的特点,出现的第一个目标值即为最优解)
基本思想:
生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。基本思想:从初始状态S 开始,利用规则,生成所有可能的状态。构成的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。
基本思想;
While Not Queue.Empty ()
Begin
可加结束条件
Tmp = Queue.Top ()
从Tmp循环拓展下一个状态Next
If 状态Next合法 Then
Begin
生成新状态Next
Next.Step = Tmp.Step + 1
Queue.Pushback (Next)
End
Queue.Pop ()
End


1 0