JSK-353 求同存异【暴力+排序+二分】

本文探讨了两个数组中寻找共同元素的算法实现,通过C和C++代码示例,对比了暴力法与排序加二分查找的效率,适用于初学者理解数据结构与算法原理。

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

求同存异
输入两个数组(数组元素个数为 6 和 8),输出在两个数组中都出现的元素如 a[6]={2,3,4,5,6,7},b[8]={3,5,7,9,11,13,15,19},则输出 3,5,7。
输入格式
第一行输入6个整数,表示第一个数组里的6个元素。
第二行输入8个整数,表示第二个数组里的8个元素。
输出格式
输出两个数组里都出现的整数,按在第一个数组中出现的顺序输出,每行输出一个整数。
样例输入
2 3 4 5 6 7
3 5 7 9 11 13 15 19
样例输出
3
5
7

问题链接JSK-353 求同存异
问题描述:(略)
问题分析
    这个问题从数学上来说是一个判定一个集合的元素是否在另外一个集合里的问题。也是一个集合元素匹配问题。
    匹配过程中,使用排序的话则可以使用二分查找,时间上是快的。否则只能用暴力法了。
程序说明
    有关排序的算法函数,C语言的有函数qsort(),但是参数多记不住,还是C++的排序算法函数sort()更加易于使用。
    写了一个C++语言程序,使用排序和二分查找。
    也写了一个C语言程序,使用暴力法实现。暴力法是俗称,也就是枚举法,或称为穷举法。
参考链接:(略)
题记:暴力、排序和二分查找(折半查找)都是程序中最为常见的。

AC的C语言程序如下:

/* JSK-353 求同存异 */

#include <stdio.h>

#define N1 6
#define N2 8
int a[N1], b[N2];

int main()
{
    for(int i = 0; i < N1; i++)
        scanf("%d", &a[i]);
    for(int i = 0; i < N2; i++)
        scanf("%d", &b[i]);

    int i, j;
    for(i = 0; i < N1; i++)
        for(j = 0; j < N2; j++)
            if(a[i] == b[j]) {
                printf("%d\n", a[i]);
                continue;
            }

    return 0;
}

AC的C++语言程序如下:

/* JSK-353 求同存异 */

#include <bits/stdc++.h>

using namespace std;

const int N1 = 6;
const int N2 = 8;
int a[N1], b[N2];

bool find(int x)
{
    int left = 0, right = N2 - 1, mid;

    while(left < right) {
        mid = (left + right) / 2;
        if(x > b[mid])
            left = mid + 1;
        else if(x < b[mid])
            right = mid - 1;
        else
            return true;
    }

    return left == right ? (x == b[left]) : false;
}

int main()
{
    for(int i = 0; i < N1; i++)
        scanf("%d", &a[i]);
    for(int i = 0; i < N2; i++)
        scanf("%d", &b[i]);

    sort(b, b + N2);

    for(int i = 0; i < N1; i++)
        if(find(a[i]))
            printf("%d\n", a[i]);

    return 0;
}
<think>我们正在处理一个关于ROS包安装的问题。用户报告了错误“Unable to locate package ros-noetic-jsk-visualization”。根据引用[1],这个错误通常由三个原因引起:包名称不正确、包库没有添加到系统中,或者该包不适用于当前的ROS或Ubuntu版本。 因此,我们需要按照以下步骤来排查解决问题: 1. **确认包名称正确**: - 用户尝试安装的包是`ros-noetic-jsk-visualization`。我们需要确认这个包名在ROS Noetic中是否存在。 - 可以通过ROS官方索引(index.ros.org)来查询包名。或者,使用命令`apt search ros-noetic-jsk-visualization`来搜索。 2. **检查是否添加了正确的软件源**: - 由于jsk-visualization包可能不在ROS官方源中,而是属于JSK实验室的第三方源。因此,需要确保用户已经添加了JSK实验室的软件源。 - 通常,JSK实验室的软件源可以通过添加他们的APT仓库来获得。根据他们的GitHub页面(jsk-ros-pkg),添加源的方法如下: ``` sudo sh -c &#39;echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list&#39; # 但注意,上面的命令是ROS官方源,而JSK包可能在他们自己的源中。 # 实际上,根据JSK的文档,他们通常建议通过源代码构建,但也提供了二进制包。不过,对于noetic,可能需要添加他们的源。 # 经过查询,JSK有一个PPA:https://launchpad.net/~jsk-ppa/+archive/ubuntu/stable # 因此,可以尝试添加这个PPA: sudo add-apt-repository ppa:jsk-ppa/stable sudo apt update ``` 3. **检查包是否适用于当前的ROSUbuntu版本**: - 用户使用的是ROS Noetic,它需要运行在Ubuntu 20.04上。如果用户的系统是其他版本(如18.04或16.04),那么可能不兼容。 - 另外,需要确认`jsk-visualization`包是否有为Noetic编译的版本。根据JSK的GitHub,他们确实支持Noetic,但可能只提供了部分包的二进制版本,有些包可能需要从源码构建。 4. **如果以上步骤都失败,考虑从源码安装**: - 如果二进制包不可用,那么用户可能需要从源码构建这个包。这通常包括创建一个工作空间,下载源代码,然后编译。 因此,我们可以给用户以下解决方案: **步骤1:检查包名称** 运行以下命令来搜索包: ```bash apt search ros-noetic-jsk-visualization ``` 如果找不到,尝试只搜索`jsk-visualization`,看是否有其他变体。 **步骤2:添加JSK PPA并更新** 如果第一步没有找到,那么添加JSK的PPA: ```bash sudo add-apt-repository ppa:jsk-ppa/stable sudo apt update ``` 然后再次尝试安装: ```bash sudo apt install ros-noetic-jsk-visualization ``` **步骤3:检查系统版本** 确保你的Ubuntu版本是20.04(对于ROS Noetic)。使用以下命令检查: ```bash lsb_release -a ``` **步骤4:从源码安装** 如果二进制包仍然不可用,那么从源码安装。首先,创建一个工作空间(如果还没有): ```bash mkdir -p ~/jsk_ws/src cd ~/jsk_ws/src ``` 然后,克隆jsk_visualization的源代码(注意:需要确认正确的仓库分支): ```bash git clone https://github.com/jsk-ros-pkg/jsk_visualization.git -b noetic-devel ``` 然后,安装依赖并编译: ```bash cd ~/jsk_ws rosdep install --from-paths src --ignore-src -y -r catkin_make source devel/setup.bash ``` 这样,包就被安装在你的工作空间中了。 注意:在从源码安装时,可能会遇到依赖问题,需要根据错误信息安装缺失的依赖。 如果用户按照以上步骤操作,应该能够解决“Unable to locate package”的问题。 另外,根据引用[1],我们也应该提醒用户确保已经正确设置了ROS的软件源(官方源)。但通常,在安装ROS桌面完整版时已经设置,所以这里主要考虑第三方源。 最后,如果用户仍然遇到问题,建议他们查看JSK的GitHub页面或ROS问答社区寻求帮助。 生成相关问题: 1. 如何添加移除PPA? 2. 在ROS中如何从源码安装包? 3. 如何检查一个ROS包是否支持特定的发行版(如Noetic)?</think>### 解决 "Unable to locate package ros-noetic-jsk-visualization" 错误 此错误表示系统无法找到指定的 ROS 包,通常由以下原因导致: #### 1. **确认包名称正确性** - 检查包名拼写:`jsk-visualization` 是 [JSK 实验室](https://github.com/jsk-ros-pkg/jsk_visualization) 的第三方包,确认名称是否完整无误 - 尝试搜索包:`apt search ros-noetic-jsk` 查看是否存在相似包名 #### 2. **添加 JSK 软件源** 该包不在 ROS 官方源中,需手动添加 JSK 的 PPA: ```bash # 添加 JSK 实验室的软件源 sudo add-apt-repository ppa:jsk-ppa/stable sudo apt update ``` #### 3. **检查系统兼容性** - **ROS 版本**:确保系统安装的是 ROS Noetic(仅支持 Ubuntu 20.04- **Ubuntu 版本**:执行 `lsb_release -a` 确认系统是 Ubuntu 20.04(Focal) - **架构支持**:某些包可能不支持 ARM 等架构,需确认 #### 4. **源码安装(备选方案)** 若二进制包不可用,需从源码编译: ```bash # 创建工作空间 mkdir -p ~/jsk_ws/src cd ~/jsk_ws/src # 克隆源码(注意分支匹配ROS版本) git clone https://github.com/jsk-ros-pkg/jsk_visualization.git -b noetic-devel # 安装依赖并编译 cd .. rosdep install --from-paths src --ignore-src -y catkin_make source devel/setup.bash ``` #### 5. **验证安装结果** ```bash # 检查包是否可定位 rospack find jsk_visualization # 或尝试启动测试节点 roslaunch jsk_visualization sample.launch ``` > **关键提示**: > JSK 包更新可能滞后于 ROS 官方版本,若仍失败,建议: > 1. 查阅 [JSK GitHub Issues](https://github.com/jsk-ros-pkg/jsk_visualization/issues) 确认兼容性 > 2. 考虑替代包如 `rqt_plot` 或 `rviz_plugins` --- ### 相关问题 1. 如何正确添加第三方 ROS 软件源(PPA)? 2. 从源码编译 ROS 包时出现依赖错误该如何解决? 3. ROS Noetic 在 Ubuntu 22.04 上能否兼容运行? 4. 如何检查某个 ROS 包是否支持特定的 Ubuntu 版本? 5. `rosdep install` 命令报错 "Unsupported OS" 时如何处理? [^1]: 引用参考自 ROS 官方文档关于包管理的说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值