[我的世界 | Java/1.12.2指令 | 进阶]算法的初步认识
前言
【资料图】
这一专栏讲解了几个我的世界中常用的算法,这些算法在指令中的运用很广泛。在某些系统中,如果不认识这些算法,你的思路就可能无法打通哦。非必学!有能力者也可以自行学习。(这个专栏不太专业,欢迎指正)
▶目录
一.算法的概念
二.为什么要学习算法?
三.算法常见思想/方法讲解与应用
一.算法的概念(百度百科 - 算法的内容与我的世界指令的结合讲解)
1.简介
“算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。” ——百度百科 - 算法
一个算法,就相当于编程中的“函数”,通过运行一系列的 指令/步骤 ,来对某个数值进行 获取/运算 ,最终得到想要的值。
在我的世界中,“算法”随处可见——红石运算、指令获取、地形生存等等技术
2.特征
百度百科 - 算法 - 特征:
一个算法应该具有以下五个重要的特征:
有穷性(Finiteness)
算法必须能在执行有限个步骤之后终止;
确切性(Definiteness)
算法的每一步骤必须有确切的定义;
输入项(Input)
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
输出项(Output)
一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
可行性(Effectiveness)
算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。
这里,我放在我的世界-函数Functions中去讲解:
(1)有穷性:函数不能是无限的、死循环的,是简洁的、有限的,即函数内的算法有有限时间、有限配置等的条件 体现:每个算法都有有限个指令;
(2)确切性:想要函数内的算法更加简洁,那么就必须让每一个指令都有意义、有作用,拒绝无效、繁琐的指令 体现:每个算法内的步骤/指令都有意义,对算法的运行有作用;
(3)输入项:函数内的算法必须要有一个正确的、有效的初始值,才能进行运算 体现:算法运行的前提是必须有一个能获取的值,这个就是输入项;
(4)输出项:初始值经过函数的运算后得出的结果。如果没有结果,那么这个算法就是有错误的 体现:这个值经过算法的运算后得到的另一个值,这个就是输出项;
(5)可行性/有效性:函数内的一组指令相当于一个步骤,函数内的算法由多个步骤组成,每个步骤可能是有不同的作用,也可能是有不同的顺序。它与 (1)有穷性 的区别在于,有穷是指时间或者空间等概念,可行性是指步骤的正确性、是否可执行,这里有一个形象的比喻:
成为亿万富翁的步骤:1.打工2.每个月把一半工资存起来,持续1000年 →不可行:人的寿命<1000年 有穷:1000年有穷3.成为亿万富翁
————————————————
版权声明:本文为CSDN博主「Vogel_im_Kafig_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Vogel_im_Kafig_/article/details/122315153
3.要素
百度百科 - 算法 - 要素:
一、数据对象的运算和操作:计算机可以执行的基本操作是以指令的形式描述的。一个计算机系统能执行的所有指令的集合,称为该计算机系统的指令系统。一个计算机的基本运算和操作有如下四类:
1.算术运算:加减乘除等运算
2.逻辑运算:或、且、非等运算
3.关系运算:大于、小于、等于、不等于等运算
4.数据传输:输入、输出、赋值等运算
二、算法的控制结构:一个算法的功能结构不仅取决于所选用的操作,而且还与各操作之间的执行顺序有关。
(1)数据对象的运算和操作(基本运算和操作的分类):
a.算术运算:加减乘除...四则远算,相当于计分板中的operation,+=加,-=减,乘*=,除/=;
b.逻辑运算:“或”两个条件满足一个就成立,“且”两个条件同时满足才成立,“非”如果“某”为真命题,那么非“某”为假命题。 ——百度知道 - 或,且,非的含义是什么?;
c.关系运算:大于、小于、等于、不等于,相当于计分板中的operation,>大于,<小于,=等于,><交换;
d.数据传输:“输入”一种调用输入函数从外部文件中输入数据赋给程序中的变量的计算机术语,即算法中获取初始值的过程,“输出”与输入相反,即算法中将运算后的初始值输出的过程,“赋值”将某一数值赋给某个变量的过程,相当于变量“计分板分数”,将某一个分数赋给这个计分板分数(operation中的"="运算),就叫做赋值
(2)算法的控制结构(算法的执行顺序)
如果函数的各个步骤乱了,那么这个函数就极大可能废掉了。执行顺序不一样,对函数内的算法的有穷性、可行性等都有影响。
4.评定
百度百科 - 算法 - 评定:
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。
时间复杂度
算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做:t(n)=o(f(n))
因此,问题的规模n越大,算法执行的时间的增长率与f(n)的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。
空间复杂度
算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
正确性
算法的正确性是评价一个算法优劣的最重要的标准。
可读性
算法的可读性是指一个算法可供人们阅读的容易程度。
鲁棒性
鲁棒性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。
(1)时间复杂度:这里的“时间复杂度”在函数上并无什么体现,一个函数文件每一游戏刻就能执行一次,但是在现实时间中,函数时间复杂度越大(命令大约大于400条时),那么游戏就会越卡顿(一般几千条指令放在一个函数文件中,执行时就会卡顿几秒..)
(2)空间复杂度:“内存空间”就相当于函数中“命令的执行消耗的内存等等”,或者说是“执行命令的工作量”,空间复杂度越大,再加上各种函数同时运行,算法的执行就会导致游戏越卡顿,这里和时间复杂度是差不多的
(3)正确性:想要辨别一个算法是否正确,就要一遍一遍试错。在试错的过程中,也要尽可能地优化、缩减指令的复杂度,但这一切都必须在“正确性”之下。“正确性”决定算法是否能够成功达到写这个算法的目的,是来评定函数/算法的最标杆。
(4)可读性:如果这个函数/算法是用来给自己写的,不给别人看,那么可读性这一条你可以忽略。“可读性”决定你的函数/算法是否适人阅读,通俗点来讲就是,是否逻辑/条理清晰。这一点可能是评定的前提,肯定要读懂才能去更好地评价/优化嘛。
(5)鲁棒性:一个函数/算法在没有容错性时,大部分的都只对一小部分内容/分数执行了命令,这里可能不是很好理解哈,举个例子:
好吧,这里可能对某些初学者更不好理解了,那就看一下CSDN的作者对其的解释:
所谓容错,拆开来讲就是,容忍错误
在计算机领域,对应的英文单词是 Fault Tolerance,翻译过来又变成容忍故障。
为什么出现这个词,这个需要回到相关背景中,比如在计算机系统中,总是不可能保证100%正常,因此总会有一定量的故障出现,并且是避免不了的,所以人们只能被迫容忍这些故障,或者说容忍这些错误,所以说这个系统是有容错的设计的,因为人们需要为容忍这些错误做一些设计来避免导致更大的问题或者说补救这个错误。
所以我们常听到,容错率。说的就是容忍这些错误的比例,通常我们都尽量减少错误,降低这个错误在整个系统中的比例,也就是说降低系统容错率
我们还说,这个设计的容错性比那个设计的容错性更好,容错性越好,就可以容忍更多的错误。
也就是说容错性的设计出现更多的错误也不会影响整个系统的总体指标。
然后也需要针对容错去做一些改善工作才能未雨绸缪,当错误出现的之后有相应的应对之法
平时玩游戏,我们也常说,这个玩法或者这个任务有更好的容错性。容错性越好,出现错误的时候带来的负面影响就越少。
————————————————
版权声明:本文为CSDN博主「cy谭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhan107876/article/details/124487238
二.为什么要学习算法?
我们首先要阐明本文的价值,帮助读者激发学习算法的热情。那么,什么是算法呢?它是一组具有良好定义的规则(或者说是一种配方),可以有效地解决一些计算方面的问题。我们可能要处理一大串数字,需要对它们进行重新整理,使它们按顺序排列;我们可能需要在地图上计算从某个起点到某个目标地点的最短路径;我们可能需要在某个最后期限之前完成一些任务,并且需要知道应该按照什么样的顺序完成这些任务,使它们都能在各自的最后期限之前完成。
我们为什么要学习算法呢?
算法对计算机科学的所有分支都非常重要。在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。例如,在斯坦福大学,每个级别(学士、硕士和博士)的计算机科学系都需要学习算法课。下面仅仅是算法应用的一些例子。
(1)通信网络中的路由协议需要使用经典的最短路径算法。
(2)公钥加密依赖于高效的数论算法。
(3)计算机图像学需要用到几何算法所提供的计算基元(computational primitive)功能。
(4)数据库的索引依赖于平衡搜索树这种数据结构。
(5)计算机生物学使用动态编程算法对基因的相似度进行测量。
类似的例子还有很多。
算法是技术革新的推动力。算法在现代的技术革新中扮演了一个关键的角色。最显而易见的一个例子是搜索引擎使用一系列的算法高效地计算与特定搜索项相关联的各个Web页面的出现频率。
这种算法最有名的例子是Google当前所使用的网页排名(PageRank)算法。事实上,在美国白宫2010年12月的一个报告中,总统的科学技术顾问作了如下的描述:
“每个人都知道摩尔定律,它是Intel的共同创立者Gordon Moore于1965年所作的一个预测:集成电路中的半导体密度每过一到两年就会扩大一倍……在许多领域,由于算法的改进所获得的性能提升甚至远远超过由于处理器速度的急剧增加所带来的性能提升。”
算法会对其他科学产生影射。虽说这个话题超出了本文的范围,但算法就像一面“镜子”一样,越来越多地用于对计算机科学技术之外的过程进行影射。例如,对量子计算的研究为量子力学提供了一种新的计算视角。经济市场中的价格波动也可以形象地看作一种算法过程。
甚至,技术革新本身也可以看作一种令人吃惊的有效搜索算法。
学习算法有益于思维。当我还是一名学生时,我最喜欢的课程始终是那些具有挑战性的课程。当我艰苦地征服这些课程时,我甚至能够感觉到自己的智商比刚开始学习这些课程时提高了几个点。我希望本文也能够为读者提供类似的体验。
算法很有趣!最后,我希望读者在读完本文后认为算法的设计和分析是件简单而愉快的事情。这并非易事,因为它需要把精确和创新这两个特征罕见地结合在一起。它常常会给我们带来挫折,但有时会让我们深深入迷。别忘了,当我们还是小孩子时,就已经开始学习算法了。
———————————————— 截取
作者:人邮异步社区 题目:为什么要学习算法? 来自:知乎-专栏
(https://zhuanlan.zhihu.com/p/51811218)
结合我的世界来讲,算法必不可少;结合你自身来讲,算法利于提升你的思维逻辑……算法无可替代,有利于你在写函数的时候抓住思绪。它在我的世界的应用也十分广泛:坐标获取、便捷出售、仿Tpa、A*寻路等。
三.算法常见思想/方法讲解及应用
- 算法的常见思想/方法(大部分简介、除命令外应用来自百度百科)
业界公认的常用算法思想有8种,分别是枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟。这8种能在我的世界中运用的很少,也可能是作者接触的少吧..
1.枚举:
(1)简介:也称“穷举”或“暴力破解法”,对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。
(2)生活应用:它常用于对于密码的破译,即将密码进行逐个推算直到找出真正的密码为止。例如一个已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。
(3)优缺点及选择:时间复杂度大,空间复杂度反而较小,容错性取决于是否“尝试”了所有范围内的数据;在迫不得已、没法直接获取数据的情况下,可使用枚举法
(4)命令应用:它常用于“获取坐标pos_x pos_y pos_z”“获取视角 rot_x rot_y”“获取点与点在坐标系中形成的图形的某一个角度”“获取‘数据标签’中不能获取的数据,例如Healthy等”
(5)更为简单的枚举:
1.打开浏览器(Chrome/Edge...)
2.按[F12]键,并点击上方选择栏中的"Console",就可以出现以下界面
3.输入后并回车运行:
其中"1000"就是你想穷举到n个指令中的"n";
say "+a+"是指令例子,可以输入其他指令,"+a+"为指令中需要穷举指令中出现的数字
"+a+"也可以替换成"+a*倍数+",就可以将穷举指令中出现的数字乘以倍数
之后我们就可以看到以下界面
但是在复制的时候后面的VMxxx:x也复制了上去,我们应该:
4.打开文本编辑器(记事本/Notepad++...),粘贴后按下Ctrl+H后将"VMxxx:x"替换为""(没有什么)
2.递推:
(1)简介:递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。 主要分为顺推和逆推。
(2)应用:斐波那契数列、汉诺塔等,都是通过一个值推算出后面的值,在数学界中的应用很广。
(3)优缺点及选择:情况不一,数据越大、间隔越大,就可能越卡顿;在需要通过一个值和一个公式算法顺推后面的值/逆推前面的值时,可选择递推法
(4)命令应用:“一键升级/降级(属性一键升/降)”
3.作差法/作商法(作商法太不容易理解了..就不再讲了,可以自己去搜)
(1)简介:应用有理数(式子)的减法运算可以比较两个有理数(式子)的大小,这就是“作差法”,既要比较两个有理数(式子)A与B的大小,可先求出A与B的差A-B,再通过其结果进行判断。
(2)比较步骤:
设要比较式A和式B。
作差:A-B;
变形:对式A-B进行化简;
判断:判断结果;
结论:A-B>0则A>B 或 A-B<0则A<B。(如果A-B=0则A=B)
(3)优缺点及选择:复杂度低,可读性还行吧,就看理不理解了;在需要确定分数相同的目标/比较分数的大小时,可选择作差法
(4)命令应用:“仿Tpa”“数据化PK”等
4.二分法:
(1)简介:二分法(Bisection method) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点(数学领域的术语..可能看不懂,在命令进阶专栏我也有相对应讲解)
(2)优缺点及选择:复杂度较大,可读性较差;如要追求更小的复杂度,可另外选择枚举法,如数据量非常大,可选择二分法
(3)命令应用:和“枚举法”差不多
其他你见过的算法、方法可以告诉作者哟~ (无知awa..
作者:Luminous_零
出品:LuminousCommand-夜光命令(761513257)
如有侵权请联系作者修改、删除
关键词:
CSDN
通信网络
OPERATION
初始条件
加减乘除
我的世界
百度知道
HEALTHY
计算机科学
LUMINOUS
我的世界指令
EFFECTIVENESS
亿万富翁
量子计算
计算机系
并非易事
algorithm
斯坦福大学
百度百科
数据结构
集成电路
英文单词
HTTPS
解决问题
基本操作
也就是说
搜索引擎
科学技术
量子力学
无可替代