当前位置:首页 > > 充电吧
[导读]/*==================================================*/ BM 算法的改进的算法Sunday Algorithm BM算法优于KMP SUNDAY

/*==================================================*/
BM 算法的改进的算法Sunday Algorithm
BM算法优于KMP
SUNDAY 算法描述:字符串查找算法中,最著名的两个是KMP算法 (Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情 况下均具有线性的查找时间。但是在实用上,KMP算法并不比最简单的c库函数
strstr()快多少,而BM算法则往往比KMP算法快上3-5倍。但是BM算法还不 是最快的算法,这里介绍一种比BM算法更快一些的查找算法。 例如我们要在"substring searching algorithm"查找"search",刚开 始时,把子串与文本左边对齐:
substring searching algorithm
search
结果在第二个字符处发现不匹配,于是要把子串往后移动。但是该移动多少呢? 这就是各种算法各显神通的地方了,最简单的做法是移动一个字符位置;KMP 是利用已经匹配部分的信息来移动;BM算法是做反向比较,并根据已经匹配的 部分来确定移动量。这里要介绍的方法是看紧跟在当前子串之后的那个字符(第 一个字符串中的'i')。 显然,不管移动多少,这个字符是肯定要参加下一步的比较的,也就是说,如 果下一步匹配到了,这个字符必须在子串内。所以,可以移动子串,使子串中 的最右边的这个字符与它对齐。现在子串'search'中并不存在'i',则说明可 以直接跳过一大片,从'i'之后的那个字符开始作下一步的比较,如下:
substring searching algorithm
search
比较的结果,第一个字符就不匹配,再看子串后面的那个字符,是'r',它在子 串中出现在倒数第三位,于是把子串向后移动三位,使两个'r'对齐,如下:
substring searching algorithm
search
这次匹配成功了!回顾整个过程,我们只移动了两次子串就找到了匹配位置, 是不是很神啊?!可以证明,用这个算法,每一步的移动量都比BM算法要大,所 以肯定比BM算法更快。
/*==================================================*/

//在文本串中,下一个字符始终和模式串中最靠右边匹配的字符对齐。

void SUNDAY(char *text, char *patt)
{
    size_t temp[256];
    size_t *shift = temp;
    size_t i, patt_size = strlen(patt), text_size = strlen(text);
    cout << "size : " << patt_size << endl;

    for( i=0; i < 256; i++ )
        *(shift+i) = patt_size+1;

    for( i=0; i < patt_size; i++ )
        *(shift+unsigned char(*(patt+i))) = patt_size-i;

    //shift['s']=6 步,shitf['e']=5 以此类推
    size_t limit = text_size-patt_size+1;
    for( i=0; i < limit; i += shift[ text[i+patt_size] ] )
    {
        if( text[i] == *patt )
        {
            char *match_text = text+i+1;
            size_t match_size = 1;
            do
            {// 输出所有匹配的位置
                if( match_size == patt_size )
                    cout << "the NO. is " << i << endl;
            }
            while( (*match_text++) == patt[match_size++] );
        }
    }
    cout << endl;
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭