当前位置: 首页 > news >正文

C++ - 查找算法 和 其他 算法

目录

一. 查找算法:

1.顺序查找:

2.二分查找:

二. 其他算法:

1.遍历算法:

2.求和、求平均值等聚合算法。

a.求和算法:

b.求平均值算法:


一. 查找算法

1.顺序查找

序查找,也叫线性查找,是一种最简单的查找算法。

基本原理
从数组的第一个元素开始,逐个与要查找的关键字进行比较,直到找到匹配的元素或者遍历完整个数组。

优点

  • 算法简单,易于理解和实现。

缺点

  • 效率相对较低,特别是在数据量较大时。

具体步骤

  1. 依次遍历数组中的每个元素。
  2. 将每个元素与要查找的目标值进行比较。
  3. 如果找到匹配的元素,返回该元素的位置或其他相关信息;如果遍历完整个数组都没有找到,则表示查找失败。

以下是一个用 C++ 实现顺序查找的代码示例:

#include <iostream>// 顺序查找函数
int sequentialSearch(int arr[], int n, int target) {for (int i = 0; i < n; i++) {if (arr[i] == target) {return i;}}return -1; // 表示未找到
}int main() {int arr[] = { 10, 20, 30, 40, 50 };int target = 30;int result = sequentialSearch(arr, sizeof(arr) / sizeof(arr[0]), target);if (result != -1) {std::cout << "元素 " << target << " 在数组中的位置是: " << result << std::endl;}else {std::cout << "未找到元素 " << target << std::endl;}return 0;
}

2.二分查找

二分查找是一种在有序数组中查找某一特定元素的搜索算法。

原理
不断将数组中间的元素与目标元素进行比较,如果相等则找到;如果目标元素小于中间元素,则在数组的前半部分继续查找;如果目标元素大于中间元素,则在数组的后半部分继续查找,如此反复,直到找到或者确定不存在。

优点
查找效率高,时间复杂度为 。

缺点
要求数组必须是有序的,并且不适用于频繁插入和删除操作的场景。

具体步骤

  1. 定义左边界 left 为 0,右边界 right 为数组长度减 1。
  2. 进入循环,当 left <= right 时:
    • 计算中间索引 mid = (left + right) / 2
    • 如果中间元素等于目标元素,返回中间索引。
    • 如果目标元素小于中间元素,将右边界更新为 mid - 1
    • 如果目标元素大于中间元素,将左边界更新为 mid + 1
  3. 循环结束后仍未找到则返回特定表示未找到的值。

以下是一个用 C++ 实现二分查找的代码示例:

#include <iostream>// 二分查找函数
int binarySearch(int arr[], int left, int right, int target) {while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;}else if (arr[mid] < target) {left = mid + 1;}else {right = mid - 1;}}return -1; // 表示未找到
}int main() {int arr[] = { 1, 3, 5, 7, 9, 11, 13 };int target = 7;int result = binarySearch(arr, 0, sizeof(arr) / sizeof(arr[0]) - 1, target);if (result != -1) {std::cout << "元素 " << target << " 在数组中的位置是: " << result << std::endl;}else {std::cout << "未找到元素 " << target << std::endl;}return 0;
}

二. 其他算法

1.遍历算法

遍历算法是用于逐个访问数据结构(如数组、链表、树等)中每个元素的方法。

以下是一些常见的遍历算法:

数组的遍历

  • 顺序遍历:从数组的第一个元素开始,依次访问每个元素直到最后一个。

链表的遍历

  • 通常从链表的头节点开始,通过节点间的指针依次访问下一个节点。

二叉树的遍历

  • 前序遍历:先访问根节点,再递归地对左子树进行前序遍历,最后对右子树进行前序遍历。
  • 中序遍历:先递归地对左子树进行中序遍历,再访问根节点,最后对右子树进行中序遍历。
  • 后序遍历:先递归地对左子树和右子树进行后序遍历,最后访问根节点。

图的遍历

  • 深度优先遍历:沿着一条路径尽可能深地探索,直到无法继续前进,然后回溯并尝试其他路径。
  • 广度优先遍历:先访问距离起始点最近的节点,再依次访问距离稍远的节点。

遍历算法的意义在于能够全面、系统地处理数据结构中的所有元素,以便进行各种操作,如查找、统计、修改等。

例如,在数组中查找特定元素、计算链表中节点的总和、在二叉树中进行特定节点的操作等都依赖于遍历算法。

不同的数据结构和应用场景可能需要选择不同的遍历方式,以达到最佳的效率和效果。

2.求和、求平均值等聚合算法

a.求和算法


就是将一组数据中的所有元素依次相加得到总和。

  • 简单地遍历数据集合,将每个元素累加到一个累加变量中。
  • 适用于各种数据结构,如数组、链表等。

b.求平均值算法


通常是先利用求和算法得到总和,然后除以元素的数量。

  • 先求出总和,再除以元素个数得到平均值。

具体步骤(以数组为例)

  1. 定义一个变量用于存储总和,初始化为 0。
  2. 遍历数组的每个元素。
  3. 将元素累加到总和变量中。
  4. 计算平均值时,将总和除以数组的长度。

以下是用 C++ 实现求数组元素总和和平均值的代码示例:

#include <iostream>// 计算数组总和
int sum(int arr[], int size) {int total = 0;for (int i = 0; i < size; i++) {total += arr[i];}return total;
}// 计算数组平均值
double average(int arr[], int size) {int total = sum(arr, size);return static_cast<double>(total) / size;
}int main() {int arr[] = { 10, 20, 30, 40, 50 };int size = sizeof(arr) / sizeof(arr[0]);int total = sum(arr, size);double avg = average(arr, size);std::cout << "总和: " << total << std::endl;std::cout << "平均值: " << avg << std::endl;return 0;
}

相关文章:

C++ - 查找算法 和 其他 算法

目录 一. 查找算法&#xff1a; 1.顺序查找&#xff1a; 2.二分查找&#xff1a; 二. 其他算法&#xff1a; 1.遍历算法&#xff1a; 2.求和、求平均值等聚合算法。 a.求和算法&#xff1a; b.求平均值算法&#xff1a; 一. 查找算法&#xff1a; 1.顺序查找&#xff1…...

字符串的信号(SIGNAL)和槽(SLOT)的宏连接方式弊端

字符串的信号&#xff08;SIGNAL&#xff09;和槽&#xff08;SLOT&#xff09;的宏连接方式在 Qt 4 及早期版本中广泛使用&#xff0c;但这种方法确实存在一些缺点&#xff0c;主要包括以下几点&#xff1a; 类型安全性缺失&#xff1a;由于 SIGNAL 和 SLOT 宏接受的是字符串参…...

Kali linux学习入门

Kali linux学习入门 文章目录 Kali linux学习入门Kali Linux简介Kali Linux工具篇Kali Docker安装Docker 更换国内镜像源Kali 安装 docker compose Kali Linux文档篇Kali Linux 社区篇 Kali Linux简介 Kali Linux是专门用于渗透测试linux操作系统&#xff0c;它由BackTrack发展…...

selenium中,怎么判断是否已选多选框

html文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><p>测试勾选</p><div><input type"checkbox" name"b…...

WindowManager相关容器类

窗口中容器类介绍&#xff1a; 本节内容较多&#xff0c;建议结合前面的内容一起阅读&#xff1a; 1、addWindow的宏观概念 2、WindowManager#addView_1 3、WindowManager#addView_2 1&#xff09;、WindowContainer&#xff1a; class WindowContainer<E extends WindowC…...

零售行业运营有哪些业务场景?详解各业务场景的分析指标和维度

在当今这个数字化迅速发展的时代&#xff0c;零售行业正经历着前所未有的变革。传统的零售模式正在被新兴的技术和创新的业务场景所颠覆&#xff0c;消费者的需求和购物习惯也在不断地演变。零售行业的运营&#xff0c;作为连接消费者、产品和市场的关键环节&#xff0c;对于零…...

无锡哲讯携手SAP,赋能装备制造业数字化转型

在当今快速发展的工业4.0时代&#xff0c;装备制造业作为国民经济的重要支柱&#xff0c;正面临着前所未有的机遇与挑战。无锡哲讯智能科技有限公司凭借其深厚的行业经验和专业的SAP实施能力&#xff0c;为装备制造业提供全面的数字化解决方案&#xff0c;助力企业实现智能化、…...

TPM仿真环境搭建

文章目录 背景及注意事项一、CMake二、m4三、GNU MP Library四、TPM_Emulator五、TSS协议栈&#xff08;trousers-0.3.14.tar.gz&#xff09;六、 tpm-tools七、查看是否安装成功八、测试 TPM环境&#xff08;需要开三个终端分别运行&#xff09;8.1 启动TPM &#xff08;第一个…...

提高篇(五):使用Processing创作互动艺术:从灵感到实现

提高篇(五):使用Processing创作互动艺术:从灵感到实现 引言 互动艺术将观众从被动的观察者转变为主动参与者,通过创意编程和技术手段,让艺术品具备感知和回应的能力。Processing作为一种强大的创意编程工具,提供了丰富的功能和灵活的编程环境,帮助艺术家和设计师实现他…...

华为od-C卷100分题目-3用连续自然数之和来表达整数

华为od-C卷100分题目-3用连续自然数之和来表达整数 题目描述 一个整数可以由连续的自然数之和来表示给定一个整数&#xff0c;计算该整数有几种连续自然数之和的表达式&#xff0c;且打印出每种表达式 输入描述 一个目标整数T(1<T<1000) 输出描述 该整数的所有表达…...

Chrome 自动执行 JS 脚本 | Tampermonkey 插件

文章目录 第 1 步:安装插件 Tampermonkey第 2 步:固定到工具栏第 3 步:在网站上启用 Tampermonkey第 4 步:查看效果第 5 步:调试 JS 代码😂 背景:有个网站,每次进去都要点 3 次才能把相关页面展开。而且,页面经常会自己刷新,导致展开的页面又收回去了。【这一天天的…...

ffmplay 源码解读

stream_open 讲解 // 定义一个静态函数用于初始化并返回VideoState结构体指针&#xff0c;用于管理播放状态 static VideoState* stream_open(const char* filename, AVInputFormat* iformat) {VideoState* is; // 创建VideoState结构体指针// 分配内存并初始化VideoState结构…...

java web如何调用py脚本文件

Controller public class IndexController {RequestMapping("/pythonTest")ResponseBodypublic String pythonTest(){// 假设你的Python脚本名为script.pyString pythonScriptPath "D:\\project\\c1\\hello.py";ProcessBuilder processBuilder new Proce…...

K8s:无状态

无状态服务 无状态服务是指服务的实例之间没有持久化状态&#xff0c;每个实例都是相同的&#xff0c;可以互换使用。 调度器 ReplicationController 简称 RC是 Kubernetes 早期版本中用来确保 Pod 副本始终运行的 API 对象。它通过监控 Pod 副本的数量&#xff0c;确保任何…...

Docker 入门篇(九)-- 使用 Maven 插件 构建 Docker 镜像

在这篇教程中&#xff0c;我们将学习如何使用 Maven 插件为 Spring Boot 应用构建 Docker 镜像。我们将使用 spring-boot-maven-plugin 和 dockerfile-maven-plugin 这两个插件。 一、前提条件 已安装 Docker。已安装 JDK 8 或以上版本。已安装 Maven。 二 创建一个 Spring …...

网络协议三

数据中心 一、DNS 现在网站的数目非常多&#xff0c;常用的网站就有二三十个&#xff0c;如果全部用 IP 地址进行访问&#xff0c;恐怕很难记住 根 DNS 服务器 &#xff1a;返回顶级域 DNS 服务器的 IP 地址 顶级域 DNS 服务器&#xff1a;返回权威 DNS 服务器的 IP 地址 …...

LeetCode LRU缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;…...

Parallels Desktop for Mac 19.4.0更新了哪些内容?有什么改进?

带来了重新设计的共享 Mac 文件夹版本&#xff0c;这些文件夹现在是符号链接&#xff0c;像指针一样指向您的 Mac 文件夹中的文件&#xff0c;同时仍然显示在 Windows 的本地磁盘上。 修复了由于共享文件夹问题导致 NinjaTrader 无法正常启动的问题。 修复了由于共享文件夹问…...

Python 将CSV文件转为PDF文件

CSV文件通常用于存储大量的数据&#xff0c;而PDF文件则是一种通用的文档格式&#xff0c;便于与他人共享和打印。将CSV文件转换成PDF文件可以帮助我们更好地管理和展示数据。本文将介绍如何通过Python编程将CSV文件导出为PDF文件。 Python Excel库安装及介绍 在 Python 中&am…...

4_XMR交易过程

XMR交易过程 参考文档 书: 《精通门罗币 : 私密交易的未来》(Mastering Monero) 书中的代码示例: 《精通门罗币 : 私密交易的未来》深入探究门罗币与密码学门罗币的环签名分析官方介绍视频 1.隐匿地址 Stealth Address_Monero官方介绍视频2.环签名 Ring Signature_Monero官方…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...