对pos搜索函数的研究以及优化思路···

代码摘自delphi的Pos函数。。。总的来说,若我理解无误的话,该函数才用的搜索机制并不是非常高明。。。只是简单的使用了一个倒序搜索,仅此而已。。。但其速度优于BM,应该是由于其对CPU的优化。。。

 

   首先先介绍一下register 调用约定: 从左到右,优先使用寄存器(EAX,EDX,ECX),然后使用堆栈!这个调用约定和C++里面的__fastcall有些类似,不同的是__fastcall优先使用的只有ECX和EDX。这两种调用约定应该说是最快速的调用约定。。

 

    再贴一部分比较重要的源码,,源码都注释过,,也没什么解释的。。

开始为准备做工作:

       push  ebx   ;保护ebx esp-4
       push  esi   ;保护esi esp-4
       add   esp, -16   ;esp-16  char* i,j,b,p;
       test  edx, edx   ;测试被搜索字符串
       jz    @NotFound
       test  eax, eax   ;测试要搜索的子串
       jz    @NotFound
       mov   esi, [ebp+8]  ;esi = strLen
       mov   ebx, ecx    ;ebx = substrLen
       cmp   esi, ebx   ;strLen < substrLen 则跳出
       jl    @NotFound
       test  ebx, ebx   ;substrLen == 0 则跳出
       jle   @NotFound
       dec   ebx   ;substrLen--
       add   esi, edx   ;
       add   edx, ebx   ;指向开始比较的位置。str偏移为strlen(substr)的位置,比较关键,后期字符串搜索和这个指针有密切的关系
       mov   [esp+8], esi  ;j指向被搜索字符串的尾部
       add   eax, ebx
       mov   [esp+4], edx  ;i指向要搜索子串的尾部位置
       neg   ebx   ;ebx,substrLen长度减一的补码
       movzx ecx, byte ptr [eax] ;ecx = substrLen[0]
       mov   [esp], ebx   ;[esp] = ecxc
       jnz   @FindString

开始具体的搜索:
    @FindString:
           sub   esi, 2  ;
           mov   [esp+12], esi ;p = strLen-2,指向被搜索字符串后输2的位置
    @FindString2:
           cmp   cl, [edx]  ;
           jz    @Test0  ;
    @AfterTest0:
           cmp   cl, [edx+1]
           jz    @Test1
    @AfterTest1:
           add   edx, 2  ;str = str + 2;
           cmp   edx, [esp+12] ;
           jb    @FindString4 ;从后向前比较如果在从后数两位以上则执行每四位比较一次的操作
           cmp   edx, [esp+8] ;
           jb    @FindString2 ;如果后面只剩了两位,则只能进行最后两位的操作。
           xor   eax, eax
           jmp   @Exit1

 (Test0 , Test1 , Test2 , Test3操作相同,只是调整了一下指针的位置,只是调整了一下指针的位置)

 

其它的感觉也没什么好注释的,在上面可以看到,这个算法其实思路非常简单,个人感觉,如果用这种优化方式来实现sunday算法的话,还可以让速度再次增加。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蚁群优化算法是一种基于蚁群行为学的优化算法,能够用来解决各种NP难问题。下面是一个简单的蚁群算法的Python代码实现。 首先,我们需要导入必要的库,这里使用了NumPy库来处理数据: ``` #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np ``` 接着,我们需要定义一些常量和变量,包括蚂蚁的数量、迭代次数、信息素挥发因子、信息素增强因子、起点和终点等。这里假设我们要从起点(0, 0)走到终点(10, 10): ``` # 常量定义 ANT_COUNT = 50 # 蚂蚁数量 ITERATION = 2000 # 迭代次数 EVAPORATION = 0.5 # 信息素挥发因子 ALPHA = 1 # 信息素增强因子 BETA = 2 # 启发式因子 INIT_PHEROMONE = 0.1 # 初始化信息素浓度 Q = 1 # 信息素强度 # 变量定义 ant_positions = np.zeros((ANT_COUNT, 2)) # 蚂蚁位置 pheromone = np.ones((11, 11)) * INIT_PHEROMONE # 信息素浓度 best_path = np.zeros((ITERATION, 2)) # 最佳路径 best_distance = np.inf # 最小距离 ``` 接下来,我们需要定义一些函数,包括计算距离函数、计算蚂蚁转移概率函数、更新信息素函数和选择下一个节点函数等: ``` # 计算两个节点之间的距离 def distance(p1, p2): return np.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) # 计算蚂蚁从当前节点移动到下一个节点的概率 def transition_probability(current_pos, target_pos): d = distance(current_pos, target_pos) pheromone_level = pheromone[target_pos[0], target_pos[1]] return (pheromone_level ** ALPHA) * ((1.0 / d) ** BETA) # 更新信息素浓度 def update_pheromone(paths, distances): pheromone *= (1 - EVAPORATION) for i in range(ANT_COUNT): for j in range(len(paths[i]) - 1): pos_current = paths[i][j] pos_next = paths[i][j + 1] pheromone[pos_current[0], pos_current[1]] += Q / distances[i] # 选择下一个节点 def select_next_pos(current_pos): probability = np.zeros((11, 11)) for i in range(11): for j in range(11): if i == current_pos[0] and j == current_pos[1]: continue probability[i, j] = transition_probability(current_pos, (i, j)) probability /= probability.sum() next_pos = np.unravel_index(np.random.choice(121, p=probability.ravel()), (11, 11)) return next_pos ``` 最后,我们需要进行迭代,每个蚂蚁在迭代中选择下一个节点、移动、更新信息素浓度并检查是否找到了最佳路径: ``` # 迭代 for iteration in range(ITERATION): # 蚂蚁移动 for i in range(ANT_COUNT): ant_positions[i] = (0, 0) # 蚂蚁回到起点 paths = [ant_positions[i].copy()] for j in range(1, 121): pos_current = paths[-1] pos_next = select_next_pos(pos_current) paths.append(pos_next) distance_sum = sum([distance(paths[k], paths[k + 1]) for k in range(120)]) if distance_sum < best_distance: best_distance = distance_sum best_path[iteration] = paths[-1] update_pheromone(paths, distance_sum) # 输出当前最佳路径 print("Iteration:", iteration, "Best path:", best_path[iteration], "Best distance:", best_distance) ``` 代码中的注释和代码片段中的汉字解释,是针对蚁群算法的语义进行详细的解释,但代码整体思路也可以适用于其他运用Python实现算法的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值