pcl基于八叉树进行空间划分和搜索操作

news2024/10/6 16:21:39

        建立空间索引在点云数据处理中已被广泛应用,常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构,比较有代表性的包括 BSP 树、KD 树、KDB 树、 R树、R+树、CELL 树、四叉树和八叉树等索引结构,而在这些结构中 KD 树和八叉树在 3D点云数据排列中应用较为广泛。 PCL 对八叉树的数据结构建立和索引方法进行了实现,以方便在此基础上对点云进行处理操作 。

         八叉树(Octree)的定义是:若不为空树的话,树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。那么,这要用来做什么?想象一个立方体,我们最少可以切成多少个相同等分的小立方体?答案就是8个。再想象我们有一个房间,房间里某个角落藏着一枚金币,我们想很快的把金币找出来,聪明的你会怎么做?我们可以把房间当成一个立方体,先切成八个小立方体,然后排除掉没有放任何东西的小立方体,再把有可能藏金币的小立方体继续切八等份….如此下去,平均在log_{8} (n)(n表示房间内的所有物体数)的时间内就可找到金币。因此,八叉树就是用在3D空间中的场景管理,可以很快地知道物体在3D场景中的位置,或侦测与其它物体是否有碰撞以及是否在可视范围内。

这里引入了一个概念:Voxel翻译为体积元素,简称体素。描述了一个预设的最小单位的正方体

        pcl的octree库提供了从点云数据创建具有层次的数据结构的方法。这样就可以对点数据集进行空间分区,下采样和搜索操作。每个八叉树节点有八个子节点或没有子节点。根节点描述了一个包围所有点的3维包容盒子。
        pcl_octree实现提供了有效的最近邻居搜索(邻域搜索)API,例如“ 体素(Voxel)邻居搜索”,“ K最近邻居搜索”和“半径搜索邻居”。叶子节点类也提供其他功能,例如空间“占用率”和“每个体素(Voxel)的点密度”检查;序列化和反序列化功能可将八叉树结构有效地编码为二进制格式;此外,内存池实现减少了昂贵的内存分配和释放操作,以便快速创建八叉树。
        下图说明了最低树级别的八叉树节点的体素边界框。八叉树体素围绕着兔子表面的每个3D点。红点代表点数据。该图像是使用octree_viewer创建的(visualization/tools/octree_viewer

方式二:K 近邻搜索

        本例中K被设置成10, K 近邻搜索(K nearest neighbor search)方法把搜索结果写到两个分开的向量中, 第一个pointIdxNKNSearch 包含搜索结果〈结果点的索引的向量〉, 第二个pointNKNSquaredDistance 保存相应的搜索点和近邻之间的距离平方。 

#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree_search.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc, char** argv) {
    srand((unsigned int)time(NULL));

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // Generate pointcloud data
    cloud->width = 1000;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size(); ++i) {
        cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    }
   
    float resolution = 128.0f;  // 设置分辨率为128
    // resolution该参数描述了octree叶子leaf节点的最小体素尺寸。
    pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution);
    octree.setInputCloud(cloud);  // 设置输入点云
    octree.addPointsFromInputCloud();  // 通过点云构建octree

    pcl::PointCloud<pcl::PointXYZ>::Ptr searchCloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointXYZ searchPoint;
    searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchCloud->push_back(searchPoint);
   
    int K = 10;

    std::vector<int> pointIdxNKNSearch;
    std::vector<float> pointNKNSquaredDistance;

    std::cout << "K nearest neighbor search at (" << searchPoint.x
        << " " << searchPoint.y
        << " " << searchPoint.z
        << ") with K=" << K << std::endl;

    if (octree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) {
        for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
            std::cout << "    " << cloud->points[pointIdxNKNSearch[i]].x
            << " " << cloud->points[pointIdxNKNSearch[i]].y
            << " " << cloud->points[pointIdxNKNSearch[i]].z
            << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
    }

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> originColorHandler(cloud, 255, 255, 255);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> searchColorHandler(searchCloud, 0, 255, 0);

    pcl::visualization::PCLVisualizer viewer("PCL Viewer");
    viewer.setBackgroundColor(0.1176, 0.1176, 0.2353);
    viewer.addPointCloud<pcl::PointXYZ>(cloud, originColorHandler, "cloud");
    viewer.addPointCloud<pcl::PointXYZ>(searchCloud, searchColorHandler, "search_cloud");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "search_cloud");

    pcl::PointXYZ originPoint(0.0, 0.0, 0.0);
    viewer.addLine(originPoint, searchPoint, "line");  // 添加从原点到搜索点的线段
    viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 1, 0.2784, "line");
    viewer.addCoordinateSystem(200); // 指定坐标轴的长度,单位mm

    while (!viewer.wasStopped()) {
        viewer.spinOnce();
    }

    return 0;
}

 

octree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance)

 pcl::octree::OctreePointCloudSearch<pcl::PointXYZ>::nearestKSearch()方法返回一个整数值,表示搜索操作是否成功并且找到了足够的最近邻点。如果搜索成功并且找到了至少K个最近邻点,则返回实际找到的最近邻点数量;否则,返回0。

该方法将给定的搜索点作为参数,并在八叉树中搜索最近的K个邻近点。找到的最近邻点的索引将存储在pointIdxNKNSearch向量中,而对应的欧氏距离平方将存储在pointNKNSquaredDistance向量中。


方式一:“体素近邻搜索”

        体素近邻搜索(Neighbors within voxel search):它把查询点所在的体素中其他点的索引作为查询结果返回,结果以点索引向量的形式保存,因此搜索点和搜索结果之间的距离取决于八叉树的分辨率参数。

#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree_search.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc, char** argv) {
    srand((unsigned int)time(NULL));

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // Generate pointcloud data
    cloud->width = 1000;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size(); ++i) {
        cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    }
   
    float resolution = 128.0f;  // 设置分辨率为128
    // resolution该参数描述了octree叶子leaf节点的最小体素尺寸。
    pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution);
    octree.setInputCloud(cloud);  // 设置输入点云
    octree.addPointsFromInputCloud();  // 通过点云构建octree

    pcl::PointCloud<pcl::PointXYZ>::Ptr searchCloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointXYZ searchPoint;
    searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchCloud->push_back(searchPoint);
   
    std::vector<int> pointIdxVec;

    if (octree.voxelSearch(searchPoint, pointIdxVec)) {
        std::cout << "Neighbors within voxel search at (" << searchPoint.x
            << " " << searchPoint.y
            << " " << searchPoint.z << ")"
            << std::endl;

        for (size_t i = 0; i < pointIdxVec.size(); ++i)
            std::cout << "    " << cloud->points[pointIdxVec[i]].x
            << " " << cloud->points[pointIdxVec[i]].y
            << " " << cloud->points[pointIdxVec[i]].z << std::endl;
    }

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> originColorHandler(cloud, 255, 255, 255);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> searchColorHandler(searchCloud, 0, 255, 0);

    pcl::visualization::PCLVisualizer viewer("PCL Viewer");
    viewer.setBackgroundColor(0.1176, 0.1176, 0.2353);
    viewer.addPointCloud<pcl::PointXYZ>(cloud, originColorHandler, "cloud");
    viewer.addPointCloud<pcl::PointXYZ>(searchCloud, searchColorHandler, "search_cloud");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "search_cloud");

    pcl::PointXYZ originPoint(0.0, 0.0, 0.0);
    viewer.addLine(originPoint, searchPoint, "line");  // 添加从原点到搜索点的线段
    viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 1, 0.2784, "line");
    viewer.addCoordinateSystem(200); // 指定坐标轴的长度,单位mm

    while (!viewer.wasStopped()) {
        viewer.spinOnce();
    }

    return 0;
}

 

octree.voxelSearch(searchPoint, pointIdxVec)

 ​​​​​​​pcl::octree::OctreePointCloudSearch<pcl::PointXYZ>::voxelSearch()方法返回一个bool类型的值,表示搜索操作是否成功。如果搜索成功并且找到了匹配的体素,则返回true;否则,返回false

该方法将给定的搜索点作为参数,并在八叉树中搜索包含该点的体素。如果找到匹配的体素,则会将体素内的点索引存储在pointIdxVec向量中,并返回true。如果没有找到匹配的体素,则pointIdxVec向量将为空,并返回false


 方式三:半径内近邻搜索

         半径内近邻搜索(Neighbors within radius search)原理和“K 近邻搜索”类似,它的搜索结果被写入两个分开的向量中, 这两个向量分别存储结果点的索引和对应的距离平方

#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree_search.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc, char** argv) {
    srand((unsigned int)time(NULL));

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // Generate pointcloud data
    cloud->width = 1000;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size(); ++i) {
        cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    }

    float resolution = 128.0f;  // 设置分辨率为128
    // resolution该参数描述了octree叶子leaf节点的最小体素尺寸。
    pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution);
    octree.setInputCloud(cloud);  // 设置输入点云
    octree.addPointsFromInputCloud();  // 通过点云构建octree

    pcl::PointCloud<pcl::PointXYZ>::Ptr searchCloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointXYZ searchPoint;
    searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f);
    searchCloud->push_back(searchPoint);

    std::vector<int> pointIdxRadiusSearch;
    std::vector<float> pointRadiusSquaredDistance;

    float radius = 256.0f * rand() / (RAND_MAX + 1.0f);

    std::cout << "Neighbors within radius search at (" << searchPoint.x
        << " " << searchPoint.y
        << " " << searchPoint.z
        << ") with radius=" << radius << std::endl;


    if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0) {
        for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
            std::cout << "    " << cloud->points[pointIdxRadiusSearch[i]].x
            << " " << cloud->points[pointIdxRadiusSearch[i]].y
            << " " << cloud->points[pointIdxRadiusSearch[i]].z
            << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
    }

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> originColorHandler(cloud, 255, 255, 255);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> searchColorHandler(searchCloud, 0, 255, 0);

    pcl::visualization::PCLVisualizer viewer("PCL Viewer");
    viewer.setBackgroundColor(0.1176, 0.1176, 0.2353);
    viewer.addPointCloud<pcl::PointXYZ>(cloud, originColorHandler, "cloud");
    viewer.addPointCloud<pcl::PointXYZ>(searchCloud, searchColorHandler, "search_cloud");
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "search_cloud");

    pcl::PointXYZ originPoint(0.0, 0.0, 0.0);
    viewer.addLine(originPoint, searchPoint, "line");  // 添加从原点到搜索点的线段
    viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 1, 0.2784, "line");
    viewer.addCoordinateSystem(200); // 指定坐标轴的长度,单位mm

    while (!viewer.wasStopped()) {
        viewer.spinOnce();
    }

    return 0;
}

 

octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance)

​​​​​​​pcl::octree::OctreePointCloudSearch<pcl::PointXYZ>::radiusSearch()​​​​​​​方法是用于在八叉树中执行半径搜索的函数。它根据给定的搜索点和半径,在八叉树中找到落在指定半径范围内的所有点。

以下是该方法的参数说明:

  1. searchPoint:要进行半径搜索的点,类型为pcl::PointXYZ。即你希望以这个点为中心进行半径搜索。
  2. radius:指定的搜索半径,类型为double。它定义了从搜索点出发的球体的半径,只有落在该球体内的点才会被搜索到。
  3. pointIdxRadiusSearch:存储在搜索半径范围内的点的索引的向量,类型为std::vector<int>
  4. pointRadiusSquaredDistance:存储在搜索半径范围内的点与搜索点之间的欧氏距离平方的向量,类型为std::vector<float>

使用radiusSearch()方法时,传递一个搜索点和半径作为输入参数,并提供两个向量作为输出参数。方法将填充pointIdxRadiusSearch向量以保存搜索半径范围内的点的索引,同时填充pointRadiusSquaredDistance向量以保存每个点与搜索点之间的欧氏距离平方。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用键鼠网络共享用windows控制ubuntu,实现跨屏跨系统操作

经调研发现几种网络共享鼠标方案&#xff1a;sharemouse、synergy以及Barrier&#xff0c;由于没找到合适的资料去配置sharemouse&#xff0c;synergy又收费&#xff0c;所以使用Barrier。 一、Ubuntu安装Barrier 到Ubuntu软件商城搜索Barrier点击安装即可&#xff0c;这就不再…

学成在线----day8

1、课程发布 为了提高网站的速度需要将课程信息进行缓存&#xff0c;并且要将课程信息加入索引库方便搜索&#xff0c;下图显示了课程发布后课程信息的流转情况&#xff1a; 1、向内容管理数据库的课程发布表存储课程发布信息&#xff0c;更新课程基本信息表中发布状态为已发…

【Shell】读取用户终端输入内容

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.shread_user_enter.sh #!/bin/bashprintHelp() {echo "1. hello"echo "2. world"echo "0. exit" }printHelpnumber"" while [ -z $number ]; doread -p "enter a n…

干货,让微信群活跃的秘籍

微信用户数量庞大、使用率高&#xff0c;是很多企业/商家做社群营销的第一平台&#xff0c;所以目前有很多微信社群营销管理系统。我一直在用的一个多群管理工具---微信管理系统&#xff0c;对于新手来说&#xff0c;操作也是十分的简单易上手&#xff0c;每一步都有教程指导&a…

网站被黑挂马应该怎么解决

遇到网站被黑或者被挂马&#xff0c;其实都是很正常的现象&#xff0c;做网站的站长&#xff0c;几乎都有网站被黑的历史 遇到这种问题&#xff0c;首先&#xff1a; 检查网站源文件的日期&#xff0c;回顾一下在过去一段时间里面&#xff0c;你有没有对源文件做过改动&#x…

程序员性能之道,从使用perf开始!

一、perf简介 从2.6.31内核开始&#xff0c;Linux内核自带了一个性能分析工具perf&#xff0c;能够进行函数级与指令级的热点查找。通过它&#xff0c;应用程序可以利用 PMU&#xff0c;tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题…

Apikit 自学日记:使用脚本处理数据

脚本分为 前置脚本 和 后置脚本 两种&#xff0c;分别对应 API 请求前 和 返回数据后 的两个阶段。您可以通过编写 Javascript 代码&#xff0c;在 API 前置脚本中改变请求参数&#xff0c;或者是在 API 后置脚本中改变返回结果。 脚本常用于以下几种情况&#xff1a; API 请求…

【夜深人静学数据结构与算法 | 第十一篇】枚举算法

目录 前言&#xff1a; 枚举算法&#xff1a; 优点&#xff1a; 枚举算法的种类&#xff1a; 枚举算法案例&#xff1a; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 12. 整数转罗马数字 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&…

video-05-videojs编写(全屏、非全屏)自定义控件!!!!

兄弟们&#xff01;&#xff01;看到这里&#xff0c;你马上就可以自定义控件了&#xff0c;想想是不是都激动啊&#xff0c;但是这篇文章重在思路及简单实现&#xff0c;仔细看。 目录 一、控件分类 二、实现方案&#xff08;方案二最好&#xff09; 2.1 方案1&#xff08;…

前端Vue自定义轮播图swiper 轮播图dot 轮播图指示indicate

前端Vue自定义轮播图swiper 轮播图dot 轮播图指示indicate&#xff0c;下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13193 效果图如下: ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​…

BACnet网关如何采集Modbus RTU设备转BACnet IP协议

BACnet标准是针对采暖、通风、空调、制冷控制设备设计的&#xff0c;同时也是为其他楼宇控制系统(例如照明&#xff0c;安保&#xff0c;消防等系统)的集成提供一个基本原则。 本文主要讲述了BACnet网关采集Modbus RTU设备&#xff08;M140T&#xff09;&#xff0c;将Modbus …

servlet拓展-统一响应json功能、全局异常处理

servlet拓展-统一响应json功能、全局异常处理 一、baseservlet import com.fasterxml.jackson.databind.ObjectMapper; import teamwork.com.utils.ApiResult;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.Htt…

解决IDEA连接数据库后,xml中写SQL语句不提醒数据库表字段问题

有时候我们新建了一个项目&#xff0c;或者新建了一个工程&#xff0c;明明为此项目或者工程连接了数据库&#xff0c;并且一切正确&#xff0c;但是在xml中书写SQL语句就是不提示数据库表中的相关字段&#xff0c;无论是表名也好&#xff0c;还是字段名也好&#xff0c;通通不…

信号链噪声分析15

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 模数转换器(ADC)将模拟量——现实世界中绝大部分现象的特征——转换为数字语言&#xff0c; 以便用于信息处理、计算、数据传输和控制系统。数模转换器(DAC)则用于将发送或存 储…

信号链噪声分析17

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 只是快速阅读 HarryNyquist 于 1924 年发表的《贝尔系统技术杂志》经典文章&#xff0c;并不 足以了解以其名字命名的该项准则的真正意义。当时&#xff0c;Nyquist 正致力于研…

解放双手,保障企业安全这一点很重要!

无论是交通管理部门、工业企业还是其他需要保障安全的场所&#xff0c;远程烟雾监控系统都是一个可靠的选择。 这远程烟雾监控是一项重要的技术解决方案&#xff0c;通过使用先进的传感器和监控系统来实时监测和管理烟雾情况&#xff0c;以提高安全性并及时应对潜在的风险。 客…

强化学习从基础到进阶–案例与实践[11]:AlphaStar论文解读、监督学习、强化学习、模仿学习、多智能体学习、消融实验

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

H5工具:产品生命周期四阶段及其重点关注数据指标

人有生老病死&#xff0c;同样&#xff0c;一个产品也有生命周期&#xff0c;叫产品生命周期&#xff08;Product Life Cycle&#xff09;。 产品生命周期指的是产品从进入市场到退出市场的周期性变化过程&#xff0c;它是指产品的市场寿命&#xff0c;而非产品的使用寿命。 一…

Linux自主学习 - C语言库Melon的快速入门

备注&#xff1a;ubuntu-20.04.3-desktop-amd64.iso 一、C语言库melon的安装 1、选择一个合适的文件夹用于下载Melon&#xff0c;本文以~/ProjectCode为例 在~/ProjectCode下输入git clone https://github.com/Water-Melon/Melon.git 然后&#xff0c;可以使用ls命令查看到Mel…

青大数据结构【2017】【简答】

关键字&#xff1a; 链式存储、顺序查找、折半查找、归并排序 采用链式存储结构&#xff0c;原因&#xff1a; 1&#xff09;链式存储结构进行插入和删除只需要修改相应的指针就可以了&#xff0c;适合频繁的进行插入和删除操作。 2&#xff09;链式存储不要求地址连续&…