初识算法之美

简介: 初识算法之美

对算法的理解:


计算机虽然可以高效的进行运算,但是有很多问题拼的不是算力,而是策略。如果没有策略的去计算,那再强的运算能力也只能称为“蛮力”。策略就是帮助我们如何用更少的计算步骤、更快的速度去运算出结果。换言之,策略就是你设计算法的思路,目的只有一个就是:快人一步。


计算机不同于人脑,人脑面对问题可以先去“观察”、“分析”,然后把复杂转化成简单问题(跟数学题一样,算法就是简便的解题思路)。目前在绝大多数领域计算机还不具备这个功能,离开了人脑,计算机还只是一个人的使用工具罢了。


算法有两个衡量标准:


  • 时间长短(时间复杂度)
  • 占用内存大小(空间复杂度)


先展望一下学习历程:


算法学习是一个循序渐进的过程,经常训练解题能力,逐步积累解题方法策略,最后内化成自己的知识,灵活运用去应对新的问题。


“初极狭,才通人。复行数十步,豁然开朗。”,挺喜欢这句话😁


算法知识点


  1. 高斯算法(倒序相加)
  2. 数列求和


算法题目


image.png

求: Sn=1+2+22+23+...+263=S_n = 1 + 2 + 2^2 + 2^3 + ... + 2^{63}=Sn=1+2+22+23+...+263=

该函数属于爆炸增量函数。


做题思路


方法一


公式法


如果还记得高中数学知识,不难发现,这是一个等比数列求和问题,a1=1,公比q=2,n=64a_1 = 1,公比q = 2,n = 64a1=1q=2n=64

等比数列求和公式:Sn=a1∗1−qn1−q,(q≠1)S_n = a_1 * \frac{1 - q^n}{1 - q} ,(q ≠ 1)Sn=a11q1qn(q=1)

本文暂不讲解公式推导过程

代入公式,上面的式子 = 1∗1−2641−2=264−1=184467440737095516151 * \frac{1 - 2^{64}}{1 - 2} = 2^{64} - 1 = 184467440737095516151121264=2641=18446744073709551615 ,从而转化问题,解题


方法二


忘记方法叫什么名字了,主要原理就是销项,使问题转化成第一项和最后一项的差。

根据原式,等号两边同时乘以2,得式子②2Sn=2+22+23+...+263+2642S_n = 2 + 2^2 + 2^3 + ... + 2^{63} + 2^{64}2Sn=2+22+23+...+263+264

用式子② - 原式 = Sn=264−1=18446744073709551615S_n = 2^{64} - 1 =18446744073709551615Sn=2641=18446744073709551615

据专家统计,每颗麦粒的平均重量约41.9毫克,这些麦粒的总重量为:

18446744073709551615×41.918446744073709551615×41.918446744073709551615×41.9

=772918576688430212668.5(毫克)=772918576688430212668.5(毫克)=772918576688430212668.5()

≈7729000(亿千克)≈7729000(亿千克)7729000亿

全世界人口按77亿计算,每人差不多可以分得100000千克(即100吨)!


总结


常见的算法时间复杂度有以下几类。


  1. 常数阶。 常数阶算法的运行次数是一个常数,如5、20、100。常数阶算法的时间复杂度通常用O(1)表示。


  1. 多项式阶。 很多算法的时间复杂度是多项式,通常用 0(n)、O(n2)O(n^2)O(n2)0(n3)0(n^3)0(n3)等表示。


  1. 指数阶。 指数阶算法的运行效率极差,程序员往往像躲“恶魔”一样避开这种算法。指数阶算法的时间复杂度通常用O(2n)O(2^n)O(2n)O(n!)O(n!)O(n!)O(nn)O(n^n)O(nn)等表示。


  1. 对数阶。 对数阶算法的运行效率较高,通常用O(logn)O(logn)O(logn)O(nlogn)O(nlogn)O(nlogn)等表示。 指数阶增量随着的增加而急剧增加,而对数阶增长缓慢。它们之间的关系如下:


O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)O(n!)<O(nn)O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)O(n!)<O(n^n)O(1)O(logn)O(n)O(nlogn)O(n2)O(n3)O(2n)O(n!)O(nn)


在设计算法时,我们要注意算法复杂度增量的问题,尽量避免爆炸级增量。


通过上面一个算法小例子,又勾起了我对数学的兴趣。算法跟数学是息息相关的,平常也要复习一下数学知识,相信也会有所帮助的。

目录
相关文章
|
Python
python之if语句的单分支,双分支,多分支,if逻辑运算符or,if逻辑运算符and,if语句的嵌套的定义及其使用方法
python之if语句的单分支,双分支,多分支,if逻辑运算符or,if逻辑运算符and,if语句的嵌套的定义及其使用方法
492 0
|
缓存 NoSQL Java
分布式锁有哪些应用场景和实现?
电商网站都会遇到秒杀、特价之类的活动,大促活动有一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?分布式锁就是一个解决方案。
822 0
|
Python Windows Linux
配置国内PIP源方法
python开发者都知道,当我们pip install安装扩展库的时候,经常遇到安装失败(超时)等,有时候是因为国外镜像被屏蔽了,带来不少麻烦, 随着国内python开发的增多,越来越多企业都开放了自己的pip源: #阿里云 http://mirrors.
11134 1
|
3月前
|
数据采集 自然语言处理 API
信息一键收集:新闻查询API的核心功能和技术实现
在信息爆炸时代,新闻查询API通过程序化访问聚合新闻数据源,提供实时、结构化的新闻内容服务,助力开发者构建智能化信息解决方案。
458 2
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
3138 0
|
NoSQL 测试技术 Go
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
|
机器人 数据库 Python
详解如何使用 Python 操作 Telegram(电报)机器人(二)
详解如何使用 Python 操作 Telegram(电报)机器人(二)
1130 2
|
敏捷开发 Java 测试技术
探索自动化测试的奥秘:从Selenium到Appium
【9月更文挑战第14天】软件测试,这个看似枯燥乏味却至关重要的领域,正经历着一场革命。随着技术的进步,自动化测试工具如Selenium和Appium已成为质量保证的利器。本文将带你一探这些工具的神秘面纱,了解它们如何简化测试流程、提升效率,并确保软件产品的质量。准备好,我们将深入自动化测试的世界,解锁其背后的原理和实践技巧。
|
弹性计算 缓存 开发框架
企业用户如何选择云服务器?2024年阿里云企业级服务器价格配置表整理汇总
企业在选择云服务器之前,快速云提醒要留意好以下几个要点: 1、CPU:如果网站访问流量较大,动态页面比较多,建议选择2核以上的CPU。 2、内存:内存越大,则可用缓存越大,打开速度越快,建议选择1G以上的内存。 3、硬盘:硬盘的大小要根据网站的大小来决定,在选择时应该考虑留一部分的剩余空间。 4、带宽:带宽越大,访问速度越快,支持访问人数也就越多,网站应用这类型的网站,至少要2M以上的带宽。 5、操作系统:在选择操作系统时,对哪种操作系统比较了解就选择哪种操作系统,windows系统对asp程序支持较好,不过占用内存较多;而Linux系统对php程序支持较好,更省内存。
764 2
|
Python
python实现贪吃蛇小游戏(附源码)
python实现贪吃蛇小游戏(附源码)
276 0