西南交大swjtu算法实验4.2|分治

1. 实验目的

编写一个分治算法来搜索 m*n 矩阵 matrix 中的一个目标值 target,该矩阵 具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。 通过该实例熟悉分治算法的分析求解过程,时间复杂度分析方法,以及如何设计 分治算法解决实际问题。

2. 实验任务

实验预习:

(1)采用二分搜索策略实现问题求解程序,验证输入输出结果,并对下述三种设计算法的时间复杂度进行对比分析: 方法一:蛮力法,对于每一行可以像搜索未排序的一维数组——通过检查每个元 素来判断是否有目标值。 方法二:二分法搜索策略,矩阵已经排过序,可以采用二分查找加快搜索效率(通 过行列切片)。 方法三:搜索空间缩减策略,可以将已排序的二维矩阵划分为四个子矩阵,其中 两个可能包含目标,其中两个肯定不包含,进一步提升问题的求解效率。 (2)编写程序实现上述算法。

上机实验:

(3)上机实验,验证样例输入时程序的执行过程以及算法复杂度分析结果与实际 运行时间是否一致。 (4)撰写相应的实验报告,实验报告内容包括:实验目的、实验任务、实验环境、 实验步骤、实验结果及其分析以及实验总结等部分内容。

4. 实验步骤及结果

4.1 实验预习

4.1.1 时间复杂度分析

方法一:蛮力法,时间复杂度:O(m*n)。

方法二:二分法搜索策略,O(mlogn)

方法三:搜索空间缩减策略,O(logm*logn)

方法四:z 字型搜索,O(m+n)

4.1.2 程序实现

#include <iostream>
using namespace std;
#define Max 10
int matrix[Max][Max];
bool allsearch(int target,int m,int n)
{
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
           if (matrix[i][j] == target) {
                return true;
            }
 
        }
    }
    return false;
}
 
 
bool bsearch(int target, int line,int n)
{
        int l = 0; int r = n;
        while (l < r) {
            int mid = l + r >> 1;
            if (matrix[line][mid] >= target) { r = mid; }
            else { l = mid + 1; }
        }
        if (matrix[line][l] == target) return true;
        return false;
    }
bool searchMatrix(int target,int m,int n)
{
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] > target) { break; }
            if (matrix[i][n] < target) { continue; }
            if (bsearch(target, i,n) == true) return true;
        }
        return false;
 }
 
 
bool DropSpaceSearch(int target, int left, int right, int up, int down)
{
    if (left > right || up > down)
        return false;
    if (target<matrix[up][left] || target>matrix[down][right])
        return false;
    int mid = (left + right) /2;
    int index = up;
    while (index <= down && matrix[index][mid] <= target) {
        if (matrix[index][mid] == target)
            return true;
        index++;
    }
    return DropSpaceSearch(target, left, mid - 1, index, down) || DropSpaceSearch(target, mid + 1, right, up, index - 1);
}
bool myfind(int m, int n, int target) //z字型搜索,总搜索次数为 m + n。在这之后,x 和 y 就会超出矩阵的边界。
{
 
    int x = 0, y = n - 1;
    while (x < m && y >= 0) {
        if (matrix[x][y] == target) {
            return true;
        }
        if (matrix[x][y] > target) {
            --y;
        }
        else {
            ++x;
        }
    }
    return false;
}
 
int main() {
    int target;
    int n, m;
    cout << "输入矩阵行数和列数:";
    cin >> m >> n;
    cout << "输入矩阵:";
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
    }
    cout << "输入target:";
    cin >> target;
    cout << "遍历法:";
    if (allsearch(target,m - 1,n - 1))
        cout << "true" << endl;
    else
        cout << "false" << endl;
    cout << "二分法:";
    if (searchMatrix(target, m - 1, n - 1))
        cout << "true" << endl;
    else
        cout << "false" << endl;
    cout << "搜索空间缩减法:";
    if (DropSpaceSearch(target, 0, m - 1, 0, n - 1))
        cout << "true" << endl;
    else
        cout << "false" << endl;
    cout << "z字型搜索:";
    if (myfind(m - 1, n - 1, target))
        cout << "true" << endl;
    else
        cout << "false" << endl;
 
    return 0;
}

4.2 实验结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习的图书管理推荐系统(python版)

基于深度学习的图书管理推荐系统 1、效果图 1/1 [] - 0s 270ms/step [13 11 4 19 16 18 8 6 9 0] [0.1780757 0.17474999 0.17390694 0.17207369 0.17157653 0.168248440.1668652 0.16665359 0.16656876 0.16519257] keras_recommended_book_ids深度学习推荐列表 [9137…

ES6 学习(一)-- 基础知识

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一&#xff1a;转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 &#xff1a; 如果出现\890,\921这些的不是属于\ddd类型的&#xff0c;&#xff0c;不是一个字符…

车载电子电器架构 —— 局部网络管理汇总

车载电子电器架构 —— 局部网络管理汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

在 Linux(红帽系列) 中使用 yum 工具安装 Nginx 及 Nginx 的常用命令与 Nginx 服务的启动和停止

官方文档&#xff1a;https://nginx.org/en/linux_packages.html 在红帽系列的 Linux 发行版中&#xff0c;使用 yum 工具帮助我们管理和下载安装 rpm 软件包&#xff0c;并帮助我们自动解决 rpm 软件包之间的依赖关系。 关于 yum 可以参考&#xff1a;https://www.yuque.com/u…

ROS2 学习(一)ROS2 简介与基本使用

参考引用 动手学 ROS2 1. ROS2 介绍与安装 1.1 ROS2 的历史 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;&#xff0c;但 ROS 本身并不是一个操作系统&#xff0c;而是可以安装在现在已有的操作系统上&#xff08;Linux、Windows、Mac&…

无需mac系统申请ios证书的傻瓜式教程

在hbuilderx云打包&#xff0c;无论是开发测试还是打生产包&#xff0c;都需要p12格式的私钥证书、证书密码和证书profile文件。这三样东西都是必须的&#xff0c;点击hbuilderx的官网链接&#xff0c;它创建证书的第一步&#xff0c;就需要使用mac系统的钥匙串访问去生成一个c…

设置asp.net core WebApi函数请求参数可空的两种方式

以下面定义的asp.net core WebApi函数为例&#xff0c;客户端发送申请时&#xff0c;默认三个参数均为必填项&#xff0c;不填会报错&#xff0c;如下图所示&#xff1a; [HttpGet] public string GetSpecifyValue(string param1,string param2,string param3) {return $"…

【Qt】窗口

目录 一、概述二、菜单栏&#xff08;QMenuBar&#xff09;三、工具栏&#xff08;QToolBar&#xff09;四、状态栏&#xff08;QStatusBar&#xff09;五、浮动窗口六、对话框 一、概述 Qt窗口是通过QMainWindow类来实现的。 QMainWindow是一个为用户提供主窗口程序的类&…

用1/10的成本为节点运营者启用零认证下载

在Sui网络上运行的验证节点和完整节点需要具有最高水平的可靠性和运行时间&#xff0c;以便提供高吞吐量及区块链的可扩展性。可靠地运行有状态应用的关键部分&#xff0c;确保可以相对轻松地进行硬件故障转移。如果磁盘故障或其他类型的故障影响到运行验证节点的机器&#xff…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

记录实现水平垂直居中的5种方法

记录块级元素实现水平垂直居中的方法&#xff0c;效果如图。 <div class"parent"><div class"child">居中元素</div> </div><style> .parent {position: relative;width: 600px;height: 300px;background-color: #679389; …

每日一练 找无重复字符的最长子串

我们来看下这个题目&#xff0c;我们要统计的是不重复的子串&#xff0c;我们可以使用“滑动窗口法”&#xff0c;其实我们很容易就能想到思路。 我们的左窗代表我们目前遍历的开始&#xff0c;即我们遍历的子串的开头&#xff0c;右窗从左窗开始进行遍历&#xff0c;每次遍历…

【Redis持久化】RDB、ROB介绍和使用

RDB、ROB介绍和使用 引言ROB介绍配置指令介绍使用指令&#xff1a;dump文件修复指令快照禁用 AOF工作流程&#xff1a;文件重写&#xff1a;三种写回策略&#xff1a; 混合使用 引言 持久化的目的&#xff0c;其实就是在Redis重启或者中途崩溃的时候能够依靠自身恢复数据&…

Electron 读取本地配置 增加缩放功能(ctrl+scroll)

最近&#xff0c;一个之前做的electron桌面应用&#xff0c;需要增加两个功能&#xff1b;第一是读取本地的配置文件&#xff0c;然后记载配置文件中的ip地址&#xff1b;第二就是增加缩放功能&#xff1b; 第一&#xff0c;配置本地文件 首先需要在vue工程根目录中&#xff0…

蓝桥杯 本质上升序列

题目描述: 小蓝特别喜欢单调递增的事物。 在一个字符串中&#xff0c;如果取出若干个字符&#xff0c;将这些字符按照在字符串中的顺序排列后是单调递增的&#xff0c;则成为这个字符串中的一个单调递增子序列。 例如&#xff0c;在字符串 lanqiao 中&#xff0c;如果取出字符…

二维码门楼牌管理应用平台建设:构建智慧社区新生态

文章目录 前言一、二维码门楼牌管理应用平台概述二、公益报名功能的实现方式三、二维码门楼牌管理应用平台在智慧社区建设中的作用四、结论与展望 前言 随着科技的快速发展&#xff0c;智慧城市建设已成为现代城市管理的重要方向。二维码门楼牌管理应用平台作为智慧社区建设的…

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

Mybatis的动态SQL~

MyBatis有一个强大特性就是它的动态SQL。在实际项目开发中&#xff0c;经常需要根据不同条件拼接SQL语句&#xff0c;拼接时还要确保不能忘了必要的空格&#xff0c;有时候还要注意省掉列名列表最后的逗号...等等。在使用JDBC 或其他类似持久层框架操作数据库时&#xff0c;处理…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…