algorithm learning for Leetcode (1)
Leetcode 算法学习(一)
前言:最近学校要求必须学习C++,着重提升技能板块。为了快速升级,我在GitHub上发现了一个开源的学习号召: https://labuladong.github.io/ebook/; 目前我决定跟随lab的步子结合自身规划学习,如果有相同或类似的内容,尊重原创。
这里可以关注lab的公众号,以及lab在github发布的共享,不过在下载他的包之后还是有点懵,排版和安排都很麻烦,幸好有群的存在让我理清了很多盲区。
1. memory of them
我们认为在数据逻辑存储管理中主要由“数组”以及“链表”,两种最基本的存储管理方式。在他们的基础上才派生出“树”、“栈”、“队列”、“图”等上层逻辑。
所以,我们在学习研究他们和他们派生的上层逻辑时,必须先弄清楚他们是怎样在计算机中存储管理的,进而了解为什么它们具有相应的特征,比如数组可以随机访问而链表则不能。
首先,我们的解释器通过read数组的type a和size b分配 b 个a 规格大小的空间(所以超过这个范围就会出错,而且不会报错)。而在数组中我们认为第一个数据块的第一个字节的地址 c 是我们整个数组的地址(我们只将这个地址记录在解释器的表单,换句话说如果你想访问这个数组的任何一个元素则必须通过他的首地址),在后面的第 n 个数据块的地址就是初始地址 c + n*b。在这个过程中很明显的我们发现我们默认data1结束后下一个地址就是data2,我们没有任何软件层面的跳转的指针,那么他们只能通过物理连续的情况连续排列在一起,所以我们说数组是连续的。

其次,我们再回头说如果我们不要求每个data在物理层面上连续,那么就只能通过软件告诉我们的电脑如何找到下一个data的位置。所以,我们可以通过让每个data[i] 存储data[i+1] 的地址的方式找到这一串的数据。 显而易见,这样就意味着我们相对数组就需要更多的空间来存放地址,并且想访问第 n 个数据元素,必须通过第 n-1个元素才能知道,因此我们说链表是顺序的。(注意:和数组一样你仍然只能知道第一个头元素的地址。但是,他和数组不同的是:因为数组在物理地址连续,所以在知道第一个地址的时候,就意味着可以直接通过首地址 c + n*b 的计算方法,直接得到任意元素 n 的地址,但是链表不能直接通过首地址得到任意元素n的地址,必须一个一个的按照顺序访问才能找到。综上所述,我们得出“数组可以随机访问而链表不能随机访问的说法”)
最后,我们说因为数组在分配空间时有一个最大值,当数组空间不够用的时候就会出现错误的读写情况。所以当我们发现数组或者链表空间不够的时候就需要扩容。 链表由于没有连续物理空间限制所以不存在这样的问题直接插入即可,时复杂度为O(1), 而数组则需要重新分配一个更大的空间然后把原来的数组复制过去,这样的空间负责度为O(N)。


2. operation
这是lab的原话:数据结构种类很多,但它们存在的目的都是在不同的应用场景,尽可能高效地增删查改。
在这里我们把操作归纳为“线性以及非线性”的“遍历和访问”,并对他们进行梳理和复习。
ok, than, what is the difference between linear and nonlinear in computer?
some commonly used linear data structures are like arrays, linked lists, stacks, and queues.
Data structures like trees and graphs are some examples of nonlinear data structures.
like this.

所以综上所述,简单而符合物理存储的是线性的,复杂的、数据组织难以通过顺序方式实现且不能在非线性结构一次性运行完的是非线性的。 迭代算法将比递归算法更快,因为要反复调用函数和注册堆栈等开销。很多时候递归算法是无效的,因为它们占用更多的空间和时间。递归算法在应用简单、有效的情况下,多用于求解复杂问题。以Hannoi算法为例,通过递归简化了算法塔的设计,使迭代法得到了广泛的应用,提高了算法的效率。
这是lab的原话:所谓框架,就是套路。不管增删查改,这些代码都是永远无法脱离的结构,你可以把这个结构作为大纲,根据具体问题在框架上添加代码就行。
最后lab推荐从二叉树下手,前 10 道也许有点难受;结合框架再做 20 道,也许你就有点自己的理解了;刷完整个专题,再去做什么回溯动规分治专题,你就会发现只要涉及递归的问题,都是树的问题。
algorithm learning for Leetcode (1)的更多相关文章
- The algorithm learning of sort which include Bubblesort,Insertsort,Quicksort and Mergesort.
Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...
- (转) Deep Learning in a Nutshell: Reinforcement Learning
Deep Learning in a Nutshell: Reinforcement Learning Share: Posted on September 8, 2016by Tim Dettm ...
- How do I learn mathematics for machine learning?
https://www.quora.com/How-do-I-learn-mathematics-for-machine-learning How do I learn mathematics f ...
- Leetcode 简略题解 - 共567题
Leetcode 简略题解 - 共567题 写在开头:我作为一个老实人,一向非常反感骗赞.收智商税两种行为.前几天看到不止两三位用户说自己辛苦写了干货,结果收藏数是点赞数的三倍有余,感觉自己的 ...
- LeetCode题目解答
LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ...
- LeetCode(275)H-Index II
题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...
- Course Machine Learning Note
Machine Learning Note Introduction Introduction What is Machine Learning? Two definitions of Machine ...
- [LeetCode] 882. Reachable Nodes In Subdivided Graph 细分图中的可到达结点
Starting with an undirected graph (the "original graph") with nodes from 0 to N-1, subdivi ...
- Stanford CS229 Machine Learning by Andrew Ng
CS229 Machine Learning Stanford Course by Andrew Ng Course material, problem set Matlab code written ...
- (转) Artificial intelligence, revealed
Artificial intelligence, revealed Yann LeCunJoaquin Quiñonero Candela It's 8:00 am on a Tuesday morn ...
随机推荐
- Fiddler 教程【转】
作者: 小坦克 来源: 博客园 发布时间: 2012-07-07 14:20 阅读: 71973 次 推荐: 45 原文链接 [收藏] 阅读目录 Fiddler的基本介绍 Fiddl ...
- 浏览器中通过js获取用户语言环境方法
用户语言环境存在navigator对象中,不同浏览器分别通过如下方法获取用户浏览器语言.操作系统语言. IE6 IE7 IE8 Firefox Chrome Safari Opera naviga ...
- Python学习:Mysql(三)索引
1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有 ...
- Jquery EasyUI dataGrid 修改默认分页大小 不起效果
pageSize 不能单独使用,必须和pageList联合使用. 如果pageSize的值不在pageList中时,会以pageList中最小的值显示,而设置的pageSize无效.
- h5项目
h5项目,用vue3,用vite搭建就好,是一个新的项目. 接口还在开发,可以用mock模拟. 现有信息:接口url,ui-url,原型url(各部分的交互关系)
- 创建SFTP用户并指定访问目录 Linux
1.创建登录用户及用户组 --可以根据自身磁盘挂载情况制定用户home目录 -d 选项 groupadd test1mkdir -p /data/test1 useradd test1 -g te ...
- C#textbox更改字体颜色只读后不起作用的解决办法
textbox的属性ReadOnly设置为true只读后,只更改字体颜色并不起作用. 解决办法是,连同背景色一起设置即可. textBox1.BackColor =textBox1.BackColor ...
- spider_ip代理
title: spider_ip代理 author: 杨晓东 permalink: spider_ip代理 date: 2021-10-02 11:27:04 categories: - 投篮 tag ...
- 准备工作——安装python和开发工具
1.安装python 官网(https://www.python.org/downloads/)下载,按步骤安装,注意点击环境变量设置. 网上很多安装步骤详解. 2.或者直接安装anaconda,集成 ...
- stm32f030 模拟IIC
#define read_SDA (GPIOA->IDR&GPIO_Pin_10) >>10 //PA10 SDA#define set_SDA GPIO_SetBits(G ...