读<算法图解><笔记摘录>

news2024/11/15 14:20:05

从很多途径当中,看到过这本书的知识点,是一本很有趣的算法入门书籍,最近花费了几天的时间将其阅读完,总想着总结一下这本书的算法知识点,分享给大家,也让自己掌握地更加踏实一点.

算法:一组完成任何任务的指令

算法这玩意,在保证满足条件,并且不浪费内存的情况下,要尽可能速度更快,这就是我们要使用和选择算法的原因.
在这本书当中称为运行时间,在下面每一种算法的过程当中都尽可能会涉及到.

二分查找在这里插入图片描述

二分查找的对象是一组有序的数组,记住必须是有序的
在这组数组当中定义定义索引0是low,而索引(数组最大索引)为high
当low<=high的时候,mid=(low+high)/2
这里一看上面书籍就写错了
如果说中间索引对应的数值刚好等于我们要查找的数字
则直接返回中间索引数值就好了
否则判断中间索引对应的数值和我们要查找数字的大小关系
如果大于,则high=mid-1,相当于我们搜索low到mid-1这个范围
如果小于,则low=mid+1,相当于我们搜索mid+1到high这个范围
继续返回上面的while,迭代就行
如果运行结束,数组当中没有任何数值等于我们要查找的数值
则返回None
运行时间:
在这里插入图片描述
线性时间描述为O(n)
二分查找的运行时间描述为O(logn)
//O(n*logn)这样的算法包括快速排序—一种较快的排序算法
//O(sqrt(n)),这样的算法包括将介绍的选择排序----一种速度较慢的排序算法
O(n!)这样的算法包括将介绍的旅行商的解方案—一种速度非常慢的算法<不建议去看和使用>—正常情况下用不到的
ex:大O表示法是一种特殊的表示法,指出了算法的速度有多快.
图例如下:
在这里插入图片描述
把纵坐标想成时间,去看这几个图就行了

选择排序

需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。

ex:数组的读取速度很快,但是链表的插入和删除速度很快.
ex:在同一个数组当中,所有元素的类型都必须是相同的

使用数组意味着事项在内存当中都是相互连接的,或者说紧靠在一起的
同时数组的好处在于可以挑选出其中的任何一个事项目,例如a[1]或者a[10],可以直接输出.
但数组的插入和删除是相当麻烦的,例如一个a[5]的数组,存储有5个数据,如果删除掉开头或者结尾的数据,还比较简单,但是如果删除掉中间的数据,例如a[3],就需要将原来的a[4]和a[5]同时提前,插入同样复杂.

而链表中的元素可以存储在内存的任何敌方,不需要相互连接或者紧靠,但链表的每个元素都存储了下一个元素的地址
链表无法像数组那样可以直接挑选出,其中任何一个事项的数据,必须从头开始串联,一直到所寻找的数据为止.
链表的插入和删除相对简单,例如5个数据,我需要删除第3个数据,则只需要使得第二个数据的下一个地址为第四个数据.原来的第三个数据自动删除

选择排序:
在这里插入图片描述
就是数组从头到尾,依次比较大小,每次都找出数组当中最大或者最小的数据放在数组的一端进行存储,直到全部循环完毕.
如果是二维数组,是不是让我们想起来了冒泡法:

    //采用冒泡排序法
    for(j=1;j<i;j++)
    {
        for(k=0;k<i-j;k++)//从第一个数开始,一直到倒数第二个数,比较大小
        //然后是第一个数开始,一直到倒数第三个数,比较大小,依次
        {
            if(a[k+1]<a[k])
            {
                temp=a[k];
                a[k]=a[k+1];
                a[k+1]=temp;
            }
        }
}

递归

递归总而言之就是一种分而治之的策略
盒子里面找盒子,直到找到盒子里面的钥匙为止.
或者说递归指的就是调用自己的函数
在这里插入图片描述
在这里插入图片描述
第一种方案是递归,而第二种方案则是循环.
ex:使用循环的性能更好,但是如果使用递归,程序更加容易理解.
递归函数当中有两个条件,一个是基线条件,一个是递归条件,递归条件很容易理解,就是持续循环,那什么时候判断循环结束呢?这个就叫做基线条件
ex:调用栈
举例说明栈这个基本概念:一叠便条要简单很多,插入的待办事项放在清单的最前面;读取待办事项时,你只读取最上面的那个,并将其删除.也就是先进后出.
因此这个代办事项清单只有两种操作:压入(插入)和弹出(删除并读取)
在这里插入图片描述
ex:调用栈,每个函数都需要占用一定的内存,这将导致运行速度变慢.可以转换为循环重新编写代码.或者使用尾递归<这里不做说明>

快速排序

一种优雅的排序算法

//第一种方法,采用快速排序的方法

int cmp_int(const void* _a,const void* _b)
{
    int* a=(int*)_a; //强制类型转换
    int* b=(int*)_b;
    return *a - *b; //从小到大进行排序,升序,如果是降序,则修改为*b - *a;
}
    qsort(a,n,sizeof(a[0]),cmp_int);

是一种分开来治理的算法,可以直接使用
在这里插入图片描述

散列表

简单说,就是存储数组索引的一组代号
散列表非常适合于防止重复
思考一下,投票的时候,我们无法控制每个人只投了一票,所以我们可以采用散列表将每个人的姓名进行存储,如果出现重复的则进行条件处理.
例如:
在这里插入图片描述
上图如果无法理解,想一想手机的通讯录,里面有联系人和电话号码.我们不可能记住每一个人的电话号码,但是我们知道要给谁打电话,而通讯录里面的用户名就是散列表
在这里插入图片描述
要注意使用散列表的时候,尽可能避免冲突和保持性能:
1.较低的填装因子<=0.7
在这里插入图片描述
2.良好的散列函数

广度优先搜索

BFS算法:适合回答"到X的最短路径是什么,或者说到X是否存在路径"这样的问题

在这里插入图片描述
从起点出发,一步可以到达的地方进行存储
二步可以到达的地方进行存储
三步
四步
一直到"n步"数组当中存在有终点,则找到了从起点到终点最短路径为n

ex:队列,不同于栈,队列是一种先进先出的结构<入队和出队>
在这里插入图片描述
在这里插入图片描述
注意此处是先把第一关系的循环完,然后再执行第二关系循环.
ex:一个人可能即是a的朋友又是b的朋友,那么我们将产生重复,为避免这种情况,我们需要调用一个检查函数,如果已经执行过,则进行标记.
在这里插入图片描述
运行时间:,广度优先搜索的运行时间为O(人数 + 边数),这通常写作O(V + E),其中V为顶点(vertice)数,E为边数。
无法往后指的图叫做树,例如族谱
在这里插入图片描述

狄克斯特拉<后续我将提供一道QT,供大家理解>

找到加权图中前往X的最短路径
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
如果有负权边,就不能使用狄克斯特拉算法。
在包含负权边的图中,要找出最短路径,可使用另一种算法——贝尔曼–福德算法

贪婪算法

NP完全问题,每一步直接找到最小的或者最大的,然后加起来就是全部最小的或者最大的
局部全部都小构成了全局尽可能小

动态规划

把原来数组和所要求的结果,构成一个新的数组,称为dp数组,然后找到最后一行或者第一行当中数据的最优解,则是我们要寻找的数据.

K最近邻算法

找案例A距离或者关系最近的另一个案例B,则B的特征可以代表案例A的特征.

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

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

相关文章

18.定位元素练习-淘宝网

注意&#xff1a; 如果一个盒子定位元素属性既有left又有right,则会执行left属性。 既有top又有bottom&#xff0c;会执行top <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…

五子棋游戏AI智能算法设计

五子棋游戏C语言AI智能算法设计 近来发现编制五子棋游戏很有趣&#xff0c;尤其是AI智能算法很烧脑。网上介绍有什么贪心算法&#xff0c;剪枝算法&#xff0c;博弈树算法等等&#xff0c;不一而足。 对于人机对战的电脑智能应子算法&#xff0c;参阅很多五子棋书籍棋谱和五…

有序Map集合:LinkedHashMap和TreeMap该如何选用

文章目录前言一、为什么HashMap是无序的二、LinkedHashMap如何保证有序性三、TreeMap的底层原理四、LinkedHashMap和TreeMap比较总结前言 为什么HashMap是无序的&#xff1f;有序的Map集合有哪些&#xff1f;LinkedHashMap和TreeMap都是有序的Map集合&#xff0c;他们有什么区…

智能优化算法期末复习(更新ing)

目录 一、GA遗传算法 二、ACO蚁群算法 三、PSO粒子群算法 四、SA模拟退火算法 五、ABC人工蜂群算法 六、综合 一、GA遗传算法 1.运算流程 2.遗传算法适应值分配策略&#xff08;基于目标函数的直接分配、基于排名的分配&#xff09; 3.遗传算法在二进制问题&#xff08;如0…

Windows OpenGL ES 图像绿幕抠图

目录 一.OpenGL ES 图像绿幕抠图 1.原始图片2.效果演示 二.OpenGL ES 图像绿幕抠图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础…

Java开发必须掌握的运维知识 (十)-- Docker集群自动化部署管理:Kubernetes快速入门

一、什么是Kubernetes Kubernetes(K8S)是Google在2014年发布的一个开源项目&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。 Kubernetes通常结合docker容器工作&#xff0c;并且整合多个运行着docker容器的主机集群。 Kubernetes官网地址 二、Kubernetes相关特性 …

JavaWeb_第3章_HTTPTomcatServlet

JavaWeb_第3章_HTTP&Tomcat&Servlet 文章目录JavaWeb_第3章_HTTP&Tomcat&Servlet1&#xff0c;Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器1.3 Web核心课程安排2, HT…

vue中,页面布局之使用vue-splitpane实现窗格的拆分和调节,类似于flex布局

vue中&#xff0c;页面布局之使用vue-splitpane实现窗格的拆分和调节&#xff0c;类似于flex布局 1、基本介绍 npm地址&#xff1a;https://www.npmjs.com/package/vue-splitpane 安包 npm install vue-splitpane注册 main.js import splitPane from vue-splitpane // 注…

土豆清洗去皮机设计

目 录 摘 要 I Abstract II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.2.1国内外现状 2 1.2.2国外研究现状 2 1.3 发展趋势 3 1.4研究内容及方法 4 2毛刷式土豆清洗去皮机总体设计 5 2.1毛刷式土豆清洗去皮机的构造及工作原理 5 2.2 土豆擦皮机的相关计算 6 2.2.1设计…

动手学深度学习(1)—— 基础知识

文章目录一、基本概念1.1 关键组件数据模型目标函数优化算法1.2 各种机器学习问题监督学习无监督学习强化学习1.3 神经网络的特点二、预备知识2.1 数据操作入门运算符广播机制索引和切片节省内存转换为其他python 对象2.2 数据预处理读取数据集处理缺失的数据2.3 线性代数标量向…

WPS通过“文档部件”的“域”设置图、表和公式的自动序列号

写文档时&#xff0c;当有多张图片、多个表格和多个公式需要编号时&#xff0c;可以通过设置自动序列号&#xff0c;实现一定程度的自动编号和任意位置插入后随时更新序号。具体操作如下 ​ 1. 图的设置 在WPS中&#xff0c;首先设置好一张图片的格式后&#xff0c;对于需要设…

【并发】J.U.C线程池

线程池 经历了Java内存模型、JUC基础之AQS、CAS、Lock、并发工具类、并发容器、阻塞队列、atomic类后&#xff0c;我们开始JUC的最后一部分&#xff1a;线程池。 线程池的优势 为什么多线程会带来性能问题 多线程的性能问题&#xff0c;分为两类&#xff0c;一类是线程本身…

从今天起真正释放创造力——亚马逊云科技re:Invent

对于开发者而言&#xff0c;成就感来自于每一次敲下代码后可实现的创造力&#xff0c;而不是把时间和精力消耗在写千篇一律又无法复用的“胶水”代码&#xff0c;或是在越来越复杂的软件栈面前&#xff0c;疲惫地写业务流程并尽量减少Bug。更加不堪的是&#xff0c;有时仅仅是因…

2022.12.4 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.方法5.实验5.1 数据集5.2 网络模型5.3 实验表现6.展望深度学习1.LSTM原理1.1 什么是LSTM&#xff1f;1.2 遗忘门&#xff08;forget gate&#xff09;1.3 输入门&#xff08;input gate&#xff09;1.4 输出门&#xff08;output gate…

Python声明式统计可视化库 altair-GitHub鉴赏官

推荐理由&#xff1a;Vega-Altair是 Python 的声明式统计可视化库。借助 Vega-Altair&#xff0c;您可以花更多时间来理解数据及其含义。Vega-Altair 的 API 简单、友好且一致&#xff0c;建立在强大的 Vega-Lite JSON 规范之上。这种优雅的简单性可以用最少的代码产生漂亮而有…

FT2004(D2000)开发实战之在线开发GPIO LED程序

一 在线开发GPIO LED程序 分析GPIO LED原理图 从飞腾FT2004原理图可知,开发板将GPIO1_A3和GPIO1_A4连接到LED上,具体如下: 开发板将GPIO1_A3和GPIO1_A4连接到LED上,因此代码初始化时需要注意以下几点: => 打开/dev/gpiochip1设备 => gpio偏移量为3和4创建led.c roo…

OpenShift 4 - 从 FreeIPA/RHIdM 向 RHSSO 同步用户和组

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.11 环境中验证 文章目录安装 FreeIPA/RHIdM在 FreeIPA/RHIdM 中添加用户和组从 FreeIPA/RHIdM 向 RHSSO 同步用户和组参考红帽 RHIdM 基于开源项目 FreeIPA&#xff0c;其内部提供…

Windows Access Token

Windows Access Token Windows Token其实叫Access Token(访问令牌)&#xff0c;它是一个描 述进程或者线程安全上下文的一个对象。不同的用户登录计算机后&#xff0c; 都会生成一个Access Token&#xff0c;这个Token在用户创建进程或者线程 时会被使用&#xff0c;不断的拷贝…

如何选择和使用腾讯云服务器的方法新手教程

本文将介绍如何选择和使用腾讯云服务器的方法新手教程。云服务器能帮助快速构建更稳定、安全的应用&#xff0c;降低开发运维的难度和整体IT成本。腾讯云CVM云服务器提供多种类型的实例、操作系统和软件包。各实例中的 CPU、内存、硬盘和带宽可以灵活调整&#xff0c;以满足应用…

C++11中可变参数模板使用

在看同事编写的代码&#xff0c;发现有如下的代码&#xff0c;因为没用过&#xff0c;所以查了一下这是什么语法&#xff0c;通过查询资料知道了这是C11中增加的可变参数模板。 template<class T, class ...Args> bool GetValue(T &value, Args &&...args) c…