【基础算法Ⅰ】算法入门篇

news2025/8/8 20:24:04

目录

进入算法世界

1.输入输出

1.1输入输出

1.2快读

2.位运算

2.1运算符

2.2位运算

3.枚举

3.1枚举的引入

3.2枚举的简单理解

3.3枚举简介

3.4 枚举算法实例

算法复杂度

时间复杂度


进入算法世界

  瑞士著名的科学家Niklaus Wirth教授曾提出:数据结构+算法=程序。数据结构是程序的骨架,算法是程序的灵魂

 算法是对特定问题求解步骤的一种描述。它不依赖于任何一种语言,既可以用自然语言、程序设计语言描述,也可以用流程图、框图来表示。

 算法的特性

   ■ 有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。

  ■ 确定性:每条语句都有确定的含义、无歧义。

    ■可行性:算法在当前环境条件下可以通过有限次运算来实现。

    ■ 输入/输出:有零个或多个输入以及一个或多个输出。

如何衡量一个算法的好坏?

                 高效率、低存储

                  1. 准确性    2.易读性 3.健壮性 4.高效性 5.低存储

1.输入输出

1.1输入输出

输入输出方法

■  C/C++ ,格式化输入输出: scanf,printf 。速度快,格式容易控制。
■  C++输入输出流: cin cout 。速度慢,使用简单,自动识别类型。
■  快读: getchar 达到快速读入,其实也简单。

输入输出的选择

■  数据量大: 建议选择 scanf 或者快读,防止 TLE
■  数据量小 :可以按照喜欢的来。

1.2快读

快读代码

inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}



2.位运算

2.1运算符

运算符简介

■  运算符是什么: 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。
■   运算符有哪些: C 语言内置了丰富的运算符,并提供了以下类型的运算符:

  算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,杂项运算符。

重要运算符

■  算术运算符: + - * / % ++ --
■  关系运算符 == != > < >= <=
■  逻辑运算符: && || !
■  位运算符: & | ^ ~ << >>

2.2位运算

位运算简介

■  位运算有啥用: 位运算符作用于位,并逐位执行操作。
■  位运算具体讲解: 下表显示了 C /C++ 支持的位运算符

  假设变量 A 的值为 60,变量 B 的值为 13


运算符描述实例

&

按位与运算符,按二进制位进行"与"运算。运算规则:0&0=0;  

0&1=0;   

1&0=0;    

1&1=1;

(A & B) 将得到 12

即为 0000 1100

|

按位异或运算符,按二进制位进行"异或"运算。运算规则:

0^0=0;  

0^1=1;  

1^0=1; 

1^1=0;

(A ^ B) 将得到 49,即为 0011 0001

^

按位异或运算符,按二进制位进行"异或"运算。运算规则:

0^0=0;  

0^1=1;  

1^0=1; 

1^1=0;

(A ^ B) 将得到 49,即为 0011 0001

~

~

(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式

<<

二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

A << 2 将得到 240,即为 1111 0000

>>

二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

 A>> 2 将得到 15,即为 0000 1111

3.枚举

 

3.1枚举的引入

     

如果让你去开一扇门,从别人那拿到了一串若干把钥匙,你该怎么办呢?

3.2枚举的简单理解

1、拿出第一把钥匙                                                               1、验证第一把钥匙能否开门

2、拿出第二把钥匙                                                                2验证第二把钥匙能否开门

3、拿出第三把钥匙                                                                 3验证第三把钥匙能否开门

.

N、拿出第N把钥匙                                                                    N验证第N把钥匙能否开门            

 列举                                                                                                                                          验证

3.3枚举简介

什么是枚举

■   枚举是什么: 枚举是基于已有知识来猜测答案的一种问题求解策略。
■    枚举的思想: 枚举的思想是不断地猜测,从可能的集合中一一尝试,然后再判断题目的条件是否成立。
枚举的要点
■  给出解空间: 建立简洁的数学模型。

  枚举的时候要想清楚:可能的情况是什么?要枚举哪些要素?

■  减少枚举的空间: 枚举的范围是什么?是所有的内容都需要枚举吗?

  在用枚举法解决问题的时候,一定要想清楚这两件事,否则会带来不必要的时间开销。

■  选择合适的枚举顺序: 根据题目判断。

  比如例题中要求的是最大的符合条件的素数,那自然是从大到小枚举比较合适。 

3.4 枚举算法实例

例一:百钱买白鸡

1.问题描述:

      公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?

2.算法分析:

      利用枚举法解决该问题,以三种鸡的个数为枚举对象,分别设为ijk,用三种鸡的总数 i+j+k=100和买鸡钱的总数(1/3*i+3*j+5*k=100)作为判定条件,举各种鸡的个数。直到找到正确的答案

例一代码简易实现:

 例二:骰子的游戏

1.问题描述:

      在Alice和Bob面前的是两个骰子,上面分别写了六个数字。

    Alice和Bob轮流丢掷骰子,Alice选择第一个骰子,而Bob选择第二个,如果谁投掷出的数更大,谁就可以获胜。

    现在给定这两个骰子上的6个数字,你需要回答是Alice获胜几率更大,还是Bob获胜几率更大。(请注意获胜几率相同的情况)。

2.算法分析:

      先枚举Alice的骰子的数字,再枚举Bob的骰子的数字。比较大小,然后统计谁获胜的情况多,也就表明谁获胜的几率更大。

例二代码简易实现:

算法复杂度

好,学了枚举算法。                 

是不是所有问题都可以用枚举解决呢?

  NO

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。

      算法分析的目的在于选择合适算法和改进算法。

这就要引入算法复杂度的概念

算法复杂度分为时间复杂度和空间复杂度。

时间复杂度是指执行算法所需要的计算工作量,

而空间复杂度是指执行这个算法所需要的内存空间。

算法复杂度中,主要考虑时间复杂度,当然这不是说空间复杂度不重要。

在讲时间复杂度之前,先再引入一个概念,基本操作数。


基本操作数

■  同一个算法在不同的计算机上运行的速度会有一定的差别,并且实际运行速度难以在理论上进行计算,实际去测量又比较麻烦,所以我们通常考虑的不是算法运行的实际用时,而是算法运行所需要进行的基本操作的数量。
■  在普通的计算机上,加减乘除、访问变量(基本数据类型的变量,下同)、给变量赋值等都可以看作基本操作。
■  对基本操作的计数或是估测可以作为评判算法用时的指标。 

时间复杂度

时间复杂度

■  时间复杂度定义: 在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。
■  时间复杂度的作用: 衡量一个算法的快慢,一定要考虑数据规模的大小。所谓数据规模,一般指输入的数字个数、输入中给出的图的点数与边数等等。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即时间复杂度。
■  时间复杂度的表示: 一般情况下,算法竞赛只会用到大 O ,也就是最差复杂度。例如 O(n),O(n 2 ) O(nlogn) 等等。

                                                       算法篇下篇继续!

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

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

相关文章

在C#方法中 out、ref、in、params 关键字的小结

out&#xff1a;关键字&#xff1a; 指定的参数在进入函数时会清空自己&#xff0c;必须在函数内部赋初值 ref关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;在函数内部可以重新赋值 In关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;…

C++入门教程||C++while循环

whlie 语法 C 中 while 循环的语法&#xff1a; while(condition) {statement(s); } 在这里&#xff0c;statement(s) 可以是一个单独的语句&#xff0c;也可以是几个语句组成的代码块。condition 可以是任意的表达式&#xff0c;当为任意非零值时都为真。当条件为真时执行…

Java.md

sa一、基础篇 网络基础 TCP三次握手 1、OSI与TCP/IP 模型2、常见网络服务分层3、TCP与UDP区别及场景4、TCP滑动窗口&#xff0c;拥塞控制5、TCP粘包原因和解决方法6、TCP、UDP报文格式 HTTP协议 1、HTTP协议1.0_1.1_2.02、HTTP与HTTPS之间的区别3、Get和Post请求区别4、HTTP常见…

Python实现BP神经网络ANN单隐层回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 20世纪80年代中期&#xff0c;David Runelhart。Geoffrey Hinton和Ronald W-llians、DavidParker等人分…

SpringCloud 组件Gateway服务网关【gateway快速入门】

目录 1&#xff1a;Gateway服务网关 1.1&#xff1a;为什么需要网关 1.2&#xff1a;gateway快速入门 1&#xff09;&#xff1a;创建gateway服务&#xff0c;引入依赖 2&#xff09;&#xff1a;编写启动类 3&#xff09;&#xff1a;编写基础配置和路由规则 4&#xf…

啥牌子的无线蓝牙耳机好用?无线蓝牙耳机推荐2022

蓝牙耳机这几年技术越好越高&#xff0c;其最大的魅力就是随时随地听音乐&#xff0c;无论是上下班还是日常使用&#xff0c;出门携带也方便&#xff0c;市面上的蓝牙耳机众多&#xff0c;很多人不知道该如何选择&#xff0c;下面整理了几款音质清晰&#xff0c;综合性能优秀的…

分享25个JSP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/17ug7A_b2nHgu-x1K-GIVlQ?pwd6367 提取码&#xff1a;6367 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 renren-security轻量级权限管理系统 renr…

Linux C应用编程-1-文件IO

1.open与close #include <stdio.h> //IO操作需要包含的头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>char filename[] "text.txt";int main(void) {int fd;fd open(filename, O_RD…

systemd 252 如预期的锁定了 Linux 引导过程

导读今天给大家介绍一下systemd 252锁定 Linux 引导过程systemd 252 如预期的锁定了 Linux 引导过程 之前&#xff0c;我们 报道 过&#xff0c;systemd 创始人发文指出 Linux 引导过程不安全&#xff0c;并提出采用加密签名的统一内核镜像&#xff08;UKI&#xff09;&#x…

SA实战 · 《SpringCloud Alibaba实战》第02章-专栏设计

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe001.github.io 文章汇总:https://binghe001.github.io/md/all/all.html 大家好,我是冰河~~ 从今天开始,我们正式进入《SpringCloud Alibaba实战》专栏的学习,在《开篇》一文中,我们大体介绍了整个专栏的结构安…

html一个案例学会所有常用HTML(H5)标签

目录 前言 HTML5声明 HTML框架 head头部 声明编码格式 告诉IE浏览器&#xff0c;IE8/9及以后的版本都会以最高版本IE来渲染页面。 移动端适配 网站标题 网站正文 网站内容的组成 文字有关标签 音频视频标签 表单标签与input属性 前言 HTML没有什么难度&#xf…

计算机网络笔记6应用层

前言 站在巨人的肩膀上&#xff0c;让知识的获得更加容易&#xff01;本文为学习计算机网络后,自顶向下的学习笔记&#xff1b; 学习视频来源&#xff1a; 计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;课件pdf来源&#xff1a;评论区up bili_68567544整理目录…

Linux(基于Centos7)(三)

文章目录一、任务介绍二、任务实施2-1、管理用户账号与密码2-2、用户组管理一、任务介绍 知识目标 1.了解用户角色的类型。 2.理解用户和用户组的关系。 3.了解用户账号文件、用户密码文件和用户组账号文件。 能力目标 1.能够通过命令来创建和管理用户与用户组。 2.能够通过命…

面向对象编程·下

面向对象编程下⭐小提问解答⭐3.多态3.1向上转型 - 父类引用子类对象3.1.1方法传参3.1.2方法返回3.2动态绑定3.3方法重写3.4理解多态3.5向下转型 - 子类引用父类对象3.6super 关键字3.7在构造方法中调用重写的方法(一个坑)3.8总结4.抽象类4.1语法规则4.2抽象类的作用5.接口5.1语…

基于2D连续图像序列的行人骨架关节角度估计

目 录 第1章 绪 论 1 1.1 行人骨架关节角度估计 1 1.2 行人骨架关节角度估计的应用领域 2 1.3 行人骨架关节角度估计方法简述 3 1.3. 1 基于概率统计的方法 3 1.3.2 基于语法的方法 4 1.3.3 基于模型的方法 4 1.4 行人骨架关节角度估计的难点和面临的挑战 5 1.5 本文的研究意义…

xinput1_4.dll丢失怎么修复?修复方法分享

对于电脑系统来说牵一发而动全身。电脑系统当中的任何一个小小的文件都关系着整个电脑系统的运行&#xff0c;大家都明白&#xff0c;电脑系统以及很多的大型系统软件都是安装在电脑C盘当中的&#xff0c;所以C盘也叫做系统盘&#xff0c;系统盘中有很多非常重要的软件&#xf…

【通用设计方法】之接收异常保护

目录 前言 一、接收异常保护 二、超短包、背靠背的支持 后记 前言 为了系统的鲁棒性&#xff0c;我们常常会做一系列的异常保护功能&#xff0c;避免系统挂死。 这里仅仅介绍接收保护的某些设计思路&#xff0c;抛砖引玉。 一、接收异常保护 设计思路&#xff1a;通过可配…

肠道微生物在天然产物生物转化中的潜在作用

谷禾健康 什么是天然产物&#xff1f; 天然产物是指动物、植物、昆虫或微生物体内的组成成分或其代谢产物以及人和动物体内许多内源性的化学成分&#xff0c;是自然产生的小分子。值得注意的是&#xff0c;天然产物来源中&#xff0c;植物来源占85%以上。 谷禾在这里主要介绍植…

【服务器数据恢复】某云ECS网站服务器mysql数据恢复案例

云服务器特点&#xff1a; 1、云服务器不需要购买硬件设备&#xff0c;用户按照业务需求支付一定的费用购买相应的硬软件资源。云服务器提供商的数据中心不仅提供硬件/软件环境&#xff0c;还提供咨询服务。 2、云服务器可以充分利用资源&#xff0c;根据业务需求随时调整硬软件…

前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读小程序系统设计与实现

功能介绍 用户首次登陆系统需要注册一个用户作为账号&#xff0c;用户在登录平台后&#xff0c;可以进行平台的操作。主要模块包括以下几点&#xff1a; 登录功能&#xff1a;注册普通账号登录&#xff1b;登录后可以修改用户的基本信息&#xff0c;也可以退出。 资讯功能&…