首页 > 编程语言 >从0开始的算法(数据结构和算法)基础(一)

从0开始的算法(数据结构和算法)基础(一)

时间:2024-08-06 11:39:37浏览次数:14  
标签:计算机科学 基础 学习 算法 特定 解决 数据结构 leetcode

       当我们学会算数开始,算法就无处不在,买菜的时候18元的菜,手上就20元和三张1块的,大多数的人都会全给然后找5块吧。它们是计算机科学的核心,在数字时代更是如此,是解决问题的关键,一个好的算法工程师,到哪去都是很吃香的,对于一个普通程序猿来说,能够掌握算法(不是知道,不会用),但算法究竟是什么?它们是如何工作的?

什么是算法?

       根据计算机科学的标准定义,算法(Algorithm)是一系列定义明确的操作步骤,用于解决特定的计算问题。这个定义源自《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs)等经典计算机科学教材,强调了算法的精确性、有序性和有限性。
       上面的是官方给出的定义,知道这很难理解,不过换成我们小学的的两个锅煎三个煎饼的问题,一般步骤先煎两个饼,再煎一个饼,整体来说就是煎两个饼的时间,但是如果先煎两个饼的一面,再将一个放下煎另一个,最后时间是一个半的饼的时间。这个就是算法,根据步骤去完成,两种算法就是两种想法,好的算法就是能够节省时间或者空间。明确的指令,用于解决特定问题或执行特定任务,数据处理、计算和自动推理的步骤。

算法的基本特征

  1. 明确性:算法的每一步都必须清晰明确,没有歧义。
  2. 有限性:算法必须在有限的步骤内完成任务。
  3. 输入:算法可以有零个或多个输入。
  4. 输出:算法至少有一个输出。
  5. 有效性:算法的每一步都必须是可行的,能够在有限的时间内完成。

算法的类型

       算法有很多种类型,每种都有其特定的用途和特点。以下是一些常见的算法类型:

  1. 排序算法:如快速排序、归并排序,用于将一组数据按照特定的顺序排列。
  2. 搜索算法:如二分查找、深度优先搜索,用于在数据集中查找特定的元素。
  3. 图算法:如Dijkstra算法、A*算法,用于解决图结构中的路径问题。
  4. 动态规划:用于解决具有重叠子问题和最优子结构性质的问题。
  5. 机器学习算法:如决策树、神经网络,用于从数据中学习模式和规律。

为啥我们要学算法?

       
算法的重要性在计算机科学和信息技术领域中是无可比拟的,它们是构建现代科技世界的基石。以下是算法重要性的几个关键点:

  1. 效率与性能:算法决定了计算机程序的运行效率和性能。一个设计良好的算法可以显著减少计算时间,提高资源利用率,从而使得软件更加高效和响应迅速。

  2. 问题解决:算法是解决复杂问题的关键。无论是数据分析、机器学习、网络安全还是图形处理,都需要依赖特定的算法来实现解决方案。

  3. 创新与进步:算法的创新推动了科技的进步。新的算法可以开辟新的应用领域,例如深度学习算法的发展推动了人工智能的突破。

  4. 优化与资源管理:在资源有限的环境中,算法帮助我们优化资源分配,例如在云计算中优化服务器负载,或在移动设备上优化电池使用。

  5. 可扩展性:随着数据量的增长,算法需要能够处理更大规模的数据集。优秀的算法设计可以确保系统随着数据增长而保持高效。

  6. 用户体验:在用户界面和交互设计中,算法决定了用户体验的流畅性和直观性。例如,搜索引擎的排名算法直接影响用户的搜索体验。

  7. 安全性:在网络安全领域,算法用于加密和解密数据,确保信息传输的安全性。密码学算法是保护个人和商业数据不被未授权访问的基础。

  8. 教育和研究:算法是计算机科学教育的核心内容,它们帮助学生理解计算机如何处理信息和解决问题。同时,算法研究也是推动学科前沿发展的重要途径。

总之,算法是计算机科学和信息技术领域的核心,它们不仅影响着软件和硬件的设计,还深刻地影响着我们的日常生活和工作方式。随着技术的不断进步,算法的重要性只会越来越凸显。

如何学习算法

       学习算法其实很难。难得坚持下去,很多人只是知道部分算法,只会在特定环境下使用,算法重要的是思想,练习的多了就会了,有时候第一步是最难的(开始写),没关系,最开始从背逻辑开始,抄的多了,俺也不会 :) ,这是一个递进的过程,至少要减少使用暴力解法(刷题到了一定地步后,前期就是要能写,不要不敢写,看答案又觉得会),而且一题有多种解法,不一定就是最优:

  1. 基础知识:首先掌握编程基础(掌握一门编程语言的基础语法,至少知道逻辑能够写成伪代码)和数据结构,这是学习算法的基础。
  2. 实践:通过解决实际问题来练习算法,如参加在线编程挑战或解决算法题目。leetcode(推荐):https://leetcode.cn/
    杭电oj:https://leetcode.cn/
    上面的是纯使用后的感受,用leetcode的评测效果比较好,oj上面的题目比较经典不过提交很烦,让我有很大的想砸电脑的冲动。

在这里插入图片描述

别人的表情包,有问题联系我,侵删

  1. 学习资源:利用在线课程、教科书和论坛来学习不同类型的算法。这一本比较适合初学者:https://www.hello-algo.com/chapter_introduction/algorithms_are_everywhere/#__tabbed_1_5
  2. 分析和优化:学习如何分析算法的时间复杂度和空间复杂度,以及如何优化算法以提高效率。

结语

       算法是计算机科学的基石,它们是解决问题的关键。机器是呆板的(严谨的),只会通过你的步骤逻辑去执行,(把大象装进冰箱拢共分几步?)通过理解算法的基本概念、类型和重要性,我们可以更好地利用它们来解决现实世界中的复杂问题。后续更行简单的算法内容关注,持续更新中~~

标签:计算机科学,基础,学习,算法,特定,解决,数据结构,leetcode
From: https://www.cnblogs.com/Solidao/p/18344842

相关文章

  • 从0开始的算法(数据结构和算法)基础(二)
    算法效率的评估    评估算法效率的好坏主要涉及到算法的时间复杂度(TimeComplexity)、空间复杂度(SpaceComplexity)以及在实际应用中的运行性能。曾经调侃中文压缩包事件[1],白话、成语、文言文,大多数时候我们明意思白时间和知识量是递增的,时间增长和我们学习的文言文长短有......
  • 【数据结构】反转链表,合并有序链表,有无环的判断
    前言:小编在上期进行了单链表的模拟,这期接上期进行单链表相关题目讲解1.反转单链表 1.1.题目题目来源:.-力扣(LeetCode)给定一个单链表,实现单链表的反转,图示如下:1.2.解题思路首先在反转时,应该用到头插法,即将第一个后面的元素逐步插入到头结点之前,这里头结点每次要进......
  • 「代码随想录算法训练营」第三十天 | 动态规划 part3
    46.携带研究材料(0-1背包问题)题目链接:https://kamacoder.com/problempage.php?pid=1046文章讲解:https://programmercarl.com/背包理论基础01背包-1.html视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6/题目状态:看题解过思路:创建一个二维的dp数组,用来进行动态规划,其......
  • 数据结构 Queue 队列 -- C语言实现
    队列队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点FIFO(FirstInFirstOut)入队:进行插入操作的一端称为队尾出队:进行删除操作的一端称为队头链实栈代码实现Ququq.h#pragmaonce#define_CRT_SECURE_NO_WARNI......
  • 数学基础-快速幂、快速乘、矩阵快速幂
    快速幂幂运算的本质是做乘法,对于\(a^b\),其核心思想是将指数\(b\)进行二进制分解,然后对\(b\)的每一位进行进行乘法,时间复杂度为\(O(\logb)\)。llquick_power(lla,llb,llp){llans=1%p;for(;b;b>>=1){if(b&1)ans=an......
  • 基于springboot的协同过滤算法的个性化音乐推荐系统(源码+Lw+文档+讲解等)
    博主介绍:✌十余年IT大项目实战经验、在某机构培训学员上千名、专注于本行业领域✌技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫+大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战项目。主要内容:系统功能设计、开题报告......
  • 数据结构 Stack 栈 -- C语言实现
    栈栈的概念一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出......
  • python入门(1)基础知识介绍
    print函数a=10print(a)print(10)print("您好")print(a,b,"您好")print(chr(98))#chr将98转换为ASVCII值print("你好"+"上海")#都是字符串可以用+连接输出print('您好',end='不换行')#修改结束符,不换行,否则自动视为有\nfp=open("note.txt&......
  • 数学基础-素数
    算术基本定理任何一个大于\(1\)的正整数\(N\)都能唯一分解为有限个质数的乘积,可写作:\[N=p_1^{c_1}p_2^{c_2}...p_m^{c_m}\]其中\(c_i\)是正整数,\(p_i\)是质数,且满足\(p_1<p_2<...<p_m\)。推论:\(N\)的正约数的集合可写作:\[\{p_1^{b_1}p_2^{b_2}...p_m^{b_m}\}\]其......
  • 【数据结构】单链表
    前言:小编这里将讨论无头单向非循环的单链表。1.ArrayList的缺陷 在上一期中,小编模拟了列表的相关操作实现,可以发现在增删的过程中非常麻烦,每次增加,或者删除数据的时候,都需要将操作下标的后面所有数据进行前移或者后移。上期博客:http://t.csdnimg.cn/VI2yz所以:由于其......