由height数组构造lcp(i,j)

本文探讨如何根据height数组构建字符串后缀间的最长公共前缀(lcp)数组。通过构建完全二叉树,利用二分法和高度信息,以O(n)的时间和空间复杂度求解lcp值。主要方法包括递归地计算内部节点和叶节点的lcp,确保左子树高度小于右子树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

讨论一个字符串的所有后缀的最长公共前缀(不同后缀间前面相等部分)有两种情况:

(1)相邻排名的后缀间的lcp(pos[i],pos[i+1]).        

(2)任意后缀间的lcppos[i],pos[j]).

构造height数组的方法已在上篇博客中提到,本篇文章主要讨论如何由height数组构造lcp,由于这个方法是我自己创造,正确性还有待指正,大家看后要是觉得有不对的地方可以给我留言。

height数组求任两个后缀间的lcp()。因为搜索时利用二分法只需要lcp(L,M)lcp(M,R),所以可以利用完全二叉树进行存储,叶节点为lcp(j-1,j)即所有的height值,根节点为lcp(0,n-1),父节点lcp(i,j)=min{lcp(i,k),lcp(k,j)}(k=(i+j)/2),非终叶结点有n-2个,终叶结点有n-1个,空间复发度为O(2n-3) = O(n), 将非终叶结点保存在lcp[1..n-1]中,其中lcp(i,j) = lcp[(i+j)/2], 时间复杂度为O(n).例如如下n=8的二叉树:


(1)求lcp.主程序中调用GetLcp(0,n-1)即可求出所有所需要的lcp值。采用树的搜索进行遍历,父节点取孩子中的最小者,由于左子树的高度一定低于右子树,所以遍历时只分两种情况。因为只遍历每个节点,所以时间复杂度和空间复杂度均为O(n).

/** 通过height数组求lcp(i,j) **/

void GetLcp(int i,int j){

if(i>=j-1)return ;//到达叶结点则终止

int k=(i+j)/2;

if(k==i+1&&j==k+1){   //左右孩子均已为叶结点

lcp[k]=height[k]<height[j]?height[k]:height[j];

return;

}

if(k==i+1){//左孩子已为叶结点

GetLcp(k,j);

lcp[k]=height[k]<lcp[(k+j)/2]?height[k]:lcp[(k+j)/2];

return;

}

/** i<j-1时求二叉树的内部结点 **/

GetLcp(i,k);

GetLcp(k,j);

lcp[k]=lcp[(i+k)/2]<lcp[(k+j)/2]?lcp[(i+k)/2]:lcp[(k+j)/2];

}


### Velodyne高度图项目文件路径 在Linux环境下,`velodyne_height_map`项目的目录结构通常遵循ROS工作空间的标准布局。假设该项目已经通过源码安装并配置完成,则其主要路径可能位于用户的ROS工作空间中。 #### 工作空间路径 典型的ROS工作空间路径如下所示: ```bash /home/[username]/catkin_ws/src/velodyne_height_map/ ``` 其中 `[username]` 是当前登录用户的名称。如果该用户名为 `john`,则完整的路径可能是 `/home/john/catkin_ws/src/velodyne_height_map/`[^4]。 #### 文件结构概述 以下是 `velodyne_height_map` 的典型文件夹结构: - **src/**: 存储核心实现代码,例如 `pose_graph_node.cpp` 可能位于此目录下。 - **include/**: 头文件存储位置。 - **launch/**: 启动文件(`.launch`),用于启动节点和服务。 - **config/**: 配置参数文件,类似于 Ardupilot 中提到的 `.param` 文件[^2]。 - **data/** 或 **results/**: 数据保存路径,如 `VINS_RESULT_PATH` 所指向的位置[^1]。 对于 BEV 地图的高度信息处理逻辑,可以参考以下代码片段来理解如何生成密度地图和高度缩放[^3]: ```cpp float height_in_voxel = point.z; // 假设 z 轴表示高度 height_in_voxel /= 0.5f; // 缩放因子为 0.5 // 密度信息计算 int N = voxel_grid[voxel_index].size(); // 当前体素内的点数 const float x = 16.0f; float density_map = std::min(1.0f, log(N + 1) / log(x)); ``` #### 定位具体路径的方法 可以通过以下命令快速查找项目所在路径: ```bash rospack find velodyne_height_map ``` 上述命令会返回类似的结果:`/home/[username]/catkin_ws/src/velodyne_height_map`[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值