算法与数据结构

【Python数据结构与算法笔记day04】1.2. 算法的提出+算法的概念+算法的五大特性

久未见 提交于 2020-02-01 17:01:57
文章目录 1.2. 算法的提出 算法的提出 算法的概念 算法的五大特性 1.2. 算法的提出 算法的提出 算法的概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。 算法是独立存在的一种解决问题的方法和思想。 对于算法而言,实现的语言并不重要,重要的是思想。 算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等),我们现在是在用Python语言进行描述实现。 算法的五大特性 输入 : 算法具有0个或多个输入 输出 : 算法至少有1个或多个输出 有穷性 : 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性 :算法中的每一步都有确定的含义,不会出现二义性 可行性 :算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104134023

【Python数据结构与算法笔记day06】1.4. 算法效率衡量+执行时间反应算法效率+单靠时间值绝对可信吗?+时间复杂度与“大O记法”+如何理解“大O记法”+最坏时间复杂度+时间复杂度的几条基本计

百般思念 提交于 2020-02-01 16:08:04
文章目录 1.4. 算法效率衡量 算法效率衡量 执行时间反应算法效率 单靠时间值绝对可信吗? 时间复杂度与“大O记法” 如何理解“大O记法” 最坏时间复杂度 时间复杂度的几条基本计算规则 1.4. 算法效率衡量 算法效率衡量 执行时间反应算法效率 对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(214.583347秒相比于0.182897秒),由此我们可以得出结论: 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。 单靠时间值绝对可信吗? 假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的! 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢? 时间复杂度与“大O记法” 我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。算然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的

数据结构和算法

家住魔仙堡 提交于 2020-02-01 14:56:54
数据结构和算法 数据结构   数据结构始计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。   精心选择的数据结构可以带来更高的运行或者存储效率。   数据结构往往同高效的检索算法和索引技术有关。   数据结构指数据对象中数据元素之间的关系。 数据结构种类 数组   数组是可以在内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。 优点   1、按照索引查询元素速度快。   2、按照索引遍历数组方便。   缺点   1、数组的大小固定后就无法扩容了。   2、数组只能存储一种类型的数据。   3、添加,删除的操作慢,因为要移动其他的元素。 使用场景   频繁查询,对存储空间要求不大,很少增加和删除的情况。 栈   栈是一种特殊的线性比啊,仅能在线姓表的一端操作,栈顶允许操作,栈底不允许操作。   特点:先进后出,后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈      场景:栈常应用于实现递归功能方面的场景,例如斐波那契数列。   python栈实现 class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self,item): self

算法入门《数据结构与算法图解》+《我的第一本算法书》+《学习JavaScript数据结构与算法第3版》

时光毁灭记忆、已成空白 提交于 2020-02-01 00:48:04
最近几年学前端的人会越来越多,再加上前端的范围越来越广,从前端发展为全栈,数据结构和算法的功底要求势必将越来越高。 《数据结构与算法图解》电子书及代码是数据结构与算法的入门指南,不局限于某种特定语言,略过复杂的数学公式,用通俗易懂的方式针对编程初学者介绍数据结构与算法的基本概念,培养编程逻辑。主要内容包括:为什么要了解数据结构与算法,大O表示法及其代码优化利用,栈、队列等的合理使用,等等。 《算法图解》电子书非常的体贴,看起来也很快,用图来解释算法是非常好的想法,可作为学习数据结构和算法的电子资料,可以给你一个整体的感觉,很多细节需要继续学习,例子也很适合笔算,一步步的图解也很好! 《我的第一本算法书》电子书采用大量图片,通过详细的分步讲解,以直观、易懂的方式展现了7个数据结构和26个基础算法的基本原理。第1章介绍了链表、数组、栈等7个数据结构;从第2章到第7章,分别介绍了和排序、查找、图论、安全、聚类等相关的26个基础算法,内容涉及冒泡排序、二分查找、广度优先搜索、哈希函数、迪菲 - 赫尔曼密钥交换、k-means 算法等。 配合《算法图解》,算法动画图解APP,《学习JavaScript数据结构与算法第3版》电子书,非常直观的通过图示的方式分解各算法每一步的变化,对于初学者来说非常友好。我同时配合《算法图解》一起看,效率非常高。 《学习JavaScript数据结构与算法第3版

数据结构和算法(数据结构引入)

允我心安 提交于 2020-02-01 00:09:09
数据结构 我们如何用python中的类型来保存一个班的学生信息?如果想要快速的通过学生姓名获取信息呢? 实际上当我们在思考这个问题时,我们已经用到了数据结构。列表和字典都可以存储一个班的学生信息,单数想要在列表中获取一名同学的信息时,就要遍历整个列表,其时间复杂度为O(n),而使用字典存储时,可将学生姓名作为字典的键,学生信息作为值,进而查询时不需要遍历,使得快速获取学生信息,其时间复杂度为O(1)。 我们为了解决问题,需要将数据存储起来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理,我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构。 在上面的问题中我们可以选择python中的列表或字典来储存学生信息。列表和字典就是python内建帮我们封装好的两种数据结构。 概念 数据是一个抽象的概念,将其进行分类后得到程设计语言中的基本类型,如int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。 数据结构指数据对象中数据元素之间的关系 python给我们提供了很多现成的数据结构类型,这些系统是自定义好的,不需要我们自己去定义的数据结构叫做python的内置数据结构,比如列表,元组和字典。而有些数据组织方式,python系统里面没有直接定义

数据结构入门(三)栈的应用

别来无恙 提交于 2020-01-31 03:40:02
  在之前的两篇文章—— 数据结构入门(一)栈的实现 和 数据结构入门(二)栈的应用之数学表达式求值 中,笔者分别介绍了“栈”这个数据结构在数的进制转换和数学表达式求值方面的应用。在本文中,笔者将会再介绍栈的四个应用,它们分别是: 判断字符串是否回文 括号匹配 行编辑程序 二叉树的深度优先遍历   栈的结构实现可以参考 数据结构入门(二)栈的应用之数学表达式求值 ,本文将不再具体给出。 判断字符串是否回文   所谓回文字符串就是指正读反读均相同的字符序列,如“12321”、“aha”、“ahaha”、“清水池里池水清”均是回文,但“ahah”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。   首先我们需要找到该字符串的中心点。对于长度为奇数的字符串,中心点就是中间的那个元素;对于长度为偶数的字符串,中心点恰好位于长度为一半的那个元素及其后一个元素的中间。接着将中心点前面的字符依次入栈,然后将当前栈中的字符依次出栈,看看是否能与 中心点之后的字符一一匹配,如果都能匹配则说明这个字符串是回文字符串,否则就不是回文字符串。   以下是利用栈来实现判断字符串是否回文的Python代码: # -*- coding: utf-8 -*- # using Stack to check if a string is plalindrome from Stack import

数据结构与算法(时间复杂度和大O表示法)

江枫思渺然 提交于 2020-01-31 00:18:34
对于上一部分中的问题 算法介绍 。运行时间花费了120s,当然配置稍微低点的会花费更久的时间。并且如果将1000改为10000,甚至更高,那么花费的时间将会更加高。这里有没有一种方法对该算法进行优化呢? 对于该问题,我们不难发现,对于已经确定的a,b,那么c是唯一确定的,因为 c = 1000 − a − b c=1000-a-b c = 1 0 0 0 − a − b ,有了这样的一个思想,我们对上述代码进行改进 import time start_time = time.time() for a in range(1001): for b in range(1001): c = 1000-a-b if a**2+b**2==c**2: print("a,b,c:%d,%d,%d"%(a,b,c)) end_time = time.time() print("time:%d"%(end_time-start_time)) print('finished') 结果 a,b,c:0,500,500 a,b,c:200,375,425 a,b,c:375,200,425 a,b,c:500,0,500 time:0 finished 与之前进行对比发现,改进后的代码运行时间少了很多,花费不到1秒时间 那么我们应该如何来衡量算法的效率呢?下面有几种方式 算法效率衡量 执行时间反应算法效率

心跳与超时:高并发高性能的时间轮超时器

試著忘記壹切 提交于 2020-01-30 19:59:12
心跳与超时:高并发高性能的时间轮超时器 文章目录 心跳与超时:高并发高性能的时间轮超时器 引言 JDK 原生提供的超时任务支持 java.util.Timer ScheduledThreadPoolExecutor 更高效的数据结构 基本原理 支撑更多超过范围的延迟时间 方案一:不同轮次的延迟任务共存相同的延迟队列 方案二:多层次时间轮 Netty 的时间轮实现 接口定义 构建循环数组 新增延迟任务 工作线程workerThread 线程启动与准备工作 驱动指针和任务触发 时间轮停止 思考总结 引言 在许多业务场景中,我们都会碰到延迟任务,定时任务这种需求。特别的,在网络连接的场景中,常常会出现一些超时控制。由于服务端的连接数量很大,这些超时任务的数量往往也是很庞大的。实现对大量任务的超时管理并不是一个容易的事情。 本章我们将介绍几种用于实现超时任务的数据结构,并且最后分析 Netty 在超时任务上采取的结构和代码。 欢迎加入技术交流群186233599讨论交流,也欢迎关注笔者公众号:风火说。 JDK 原生提供的超时任务支持 java.util.Timer JDK 在 1.3 的时候引入了 Timer 数据结构用于实现定时任务。 Timer 的实现思路比较简单,其内部有两个主要属性: TaskQueue :定时任务抽象类 TimeTask 的列表。 TimerThread

数据结构与算法

我的梦境 提交于 2020-01-30 13:16:29
算法与数据结构 1.题目 洛谷 杭电 牛客网 leeCode 2.书籍 课本 刘汝佳 白皮书 算法导论 一.字符串 1.KMP算法 笔算next数组 如果数组是从1开始 max{前缀和后缀相等的长度} + 1 为当前字符的next值 如果数组从0开始 **max{前缀和后缀相等的长度}**为当前字符的next值 例如 a b a b c a b a i 1 2 3 4 5 6 7 8 k 0 1 1 2 3 1 2 3 kt -1 0 0 1 2 0 1 3 ​ 例如对于i = 5时 ​ 后缀为: b, ab, bab ​ 前缀为: a, ab, aba ​ 最大相同前缀为 ab,长度为2所以为 k = 3 同理, 如果下标从0开始就是kt。 代码 i = 0; j = next[0] = -1; //求每个字符的最大匹配的前后缀 while(i < s.length()){ if(T[i] == T[j] || i == -1){ i++; j++; next[i] = j; } else { j = next[j]; //回溯 } } 例如 : ​ i = 4, 5, *, *, 6 ​ j = 2, 3, 1, 0,1 优化 对于 aaaab, next[] = {0, 1, 2, 3, 4} 但是如果 2 失败,回溯到1仍旧失败,回溯到0还是会失败。

数据结构之数组

守給你的承諾、 提交于 2020-01-30 11:10:54
数据结构的分类 数据结构按照数据的排列特点可以分为线性表和非线性表。 线性表:数据排成一排,像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。比如数组、链表、队列,栈等。 非线性表:数据之间并不是简单的前后关系。比如:树、图,堆等。 数组的定义 数组是一种很常见的数据结构,我们学习的没门语言都会涉及。那么数组又是怎样定义的呢? 数组(Array)是一种线性表数据结构。它用连续的内存空间,来存储一组具有相同类型的数据。 数组的特性 支持随机访问。高效的查找,低效的插入和删除。 我们先来看插入操作。 假如数组的长度为n,现在,如果我们需要将一个数据插入到数组中的第k个位置。为了把第k个位置腾出来,给新的数据,我们需要将第k~n这部分的元素都顺序地往后挪一位。那插入操作的时间复杂度是多少呢? 如果在数组的末尾插入元素,那就不需要移动数据了,这个时候的时间复杂度为O(1)。但如果在数组的开头插入元素,那所有的数据都要一次往后移动一位,所以最坏时间复杂度是O(n)。因为每个位置插入元素的概率是一样的,所以平均情况时间复杂度为(1+2+…+n)/n=O(n)。 如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,就必须按照刚才的方法搬移k之后的数据。但是如果数组中存储的数据没有任何规律,数组就只是一个存储数据的集合。在这种情况下,如果要将某个数据插入到第k个位置