[0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程
忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处。 ——奥维德
一、学习目标
· 回顾在计算机科学、编程和问题解决过程中的基本知识;
· 理解“抽象”在问题解决过程中的重要作用;
· 理解并实现抽象数据结构;
· 复习Python编程语言
二、写在前面
自第一台电子计算机使用线路和开关传达人类的指令以来,我们编程的思考方式有了很大的改变,在很多方面,计算机技术的发展为计算机科学家提供了众多的工具和平台去实现他们的想法。高性能理器,高速网络和大内存使得计算机研究者必须掌握在这样复杂的螺旋式通道中的编程能力,尽管计算机发展千变万化,但是一些基本的原则是不会改变的,计算机科学所关注的是如何使用计算机去解决问题。你花了大量的时间去学习一些基本的问题解决方式并且期望在处理问题的能力上信心十足,你也知道学习些程序的困难。大型问题的复杂度和相应的解决方案大大超过了与之相关的基础问题的处理方式。
本章重点说明两个方面的内容。第一,回顾在计算机科学中研究数据结构和算法所必须遵循的框架,特别是要知道为什么学习和要理解这些主题能帮助我们更好地解决问题。第二,复习一下Python语言。尽管这里只是概要介绍和一些简短的例子,但是这回贯穿整全部的内容。
三、什么是计算机科学(Computer science)
Computer science is the study of problems, problem-solving, and the solutions that come out of the problem-solving process. Given a problem, a computer scientist’s goal is to develop an algorithm, a step-by-step list of instructions for solving any instance of the problem that might arise. Algorithms are finite processes that if followed will solve the problem. Algorithms are solutions.
……
Solutions are considered independent from the machine.
计算机科学是关于研究问题、问题解决过程以及问题解决过程的方案。提出一个问题,计算机科学家的目标就是找到一个算法,这个算法用来指导如何一步一步解决这一类问题。算法就是一种特定的处理过程,遵循这个过程就能解决这个问题,也就是说算法就是解决方案。
Computer science, as it pertains to the problem-solving process itself, is also the study of abstraction. Abstraction allows us to view the problem and solution in such a way as to separate the so-called logical and physical perspectives.
计算机科学的研究也是抽象的研究,抽象使我们看待问题的方式从具体(physical)中分离出来,从而上升到逻辑(logical)的层面。
举个例子,当你在使用Python中的math模块的,当我们导入这个模块,我们可以进行下面的处理:
上面这个例子就是一个过程的抽象(procedural abstraction),我们不需要知道sqrt函数是怎样实现的,我们唯一需要知道的如何使用这个函数。如果我们正确地导入了相关的模块,就可以假设这个函数所提供的结果是正确的,可以确定肯定是有人实现了求平方根的函数,但是我们并不关心这个问题,通常我们将这种情况抽象成一种“黑盒”模型:
We simply describe the interface: the name of the function, what is needed (the parameters), and what will be returned. The details are hidden inside。
我们只对接口进行描述:函数的名字,必要的条件(参数)以及函数的返回值。具体的细节被隐藏在内部。
四、什么是编程(Programming)
Programming is the process of taking an algorithm and encoding it into a notation, a programming language, so that it can be executed by a computer. Although many programming languages and many different types of computers exist, the important first step is the need to have the solution. Without an algorithm there can be no program.
编程就是讲算法转换为符号(编程语言)以供计算机执行。尽管有众多的编程语言和不同的计算机存在,第一步也是最重要的一步就是找到解决问题的方案,没有算法就不会有程序。
Computer science is not the study of programming. Programming, however, is an important part of what a computer scientist does. Programming is often the way that we create a representation for our solutions. Therefore, this language representation and the process of creating it becomes a fundamental part of the discipline.
计算机科学不是学习编程,编程却是计算机科学家的一项重要的工作。编程是我们建立的解决方案的具体表现,所以编程语言是基础。
在计算机中所有的数据项表现为一种二进制串,为了使这些二进制变得有意义,我们需要相应的数据类型(data types)。数据类型就是我们对二进制的交互接口,较底层的内置数据类型为算法的开发建立了基础。
The difficulty that often arises for us is the fact that problems and their solutions are very complex. These simple, language-provided constructs and data types, although certainly sufficient to represent complex solutions, are typically at a disadvantage as we work through the problem-solving process. We need ways to control this complexity and assist with the creation of solutions.
五、为什么要学习数据结构和抽象数据类型
在处理问题的时候为了防止陷入细节,通过在问题空间(problem domain)中创建数据模型可以更高效地处理问题,有更多的经历去关注问题的本身。
An abstract data type, sometimes abbreviated ADT, is a logical description of how we view the data and the operations that are allowed without regard to how they will be implemented.
抽象数据类型简称ADT,是一种对数据的逻辑抽象,对他的操作方法无需关注具体的实现。
为了提供这种级别的抽象,我们需要多数据进行封装(encapsulation)。具体就是封装实现的具体细节,确保对用户不可见,这就是信息隐藏(information hiding),如下图:
如果你是Python的初学者,或者对很多的概念感到陌生,建议你学习一下Python的基本语法和常用的模块,这里提供一些资源以供学习:
Python 官方文档:https://docs.python.org/3/reference/index.html
Python 文档(中文):http://python.usyiyi.cn/
廖雪峰的Python教程[推荐]:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
笨办法学python:http://download.csdn.net/detail/csulennon/8944755
学习资料不求多,好好看一个精品系列就行,切忌东一榔头西一锤子。
[0x01 用Python讲解数据结构与算法] 关于数据结构和算法还有编程的更多相关文章
- [0x00 用Python讲解数据结构与算法] 概览
自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- 使用python解决算法和数据结构--使用栈实现进制转换
可以将10进制数据转换成2进制,8进制,16进制等. 晚上练练算法和数据结构哈. # coding = utf-8 class Stack: def __init__(self): self.item ...
- python算法与数据结构-算法介绍(31)
一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...
- 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现
1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...
- python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表
目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
- 【数据结构】 字符串&KMP子串匹配算法
字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存 ...
- 用Python开始机器学习(2:决策树分类算法)
http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树 ...
随机推荐
- 15个专业版响应式WordPress主题
当你准备创建一个新的网站,你会发现有很多的WordPress主题供你选择,它们强大而且合适.虽然大量的第三方插件可以解决脚本的问题,但这次我们要向你介绍一些完全不同于以往的主题,它们都是专业开发者开发 ...
- paip.hibernate save 失败的解决
paip.hibernate save 失败的解决 打开log debug level,,看不见insert 代码... Hibernate select max(ID).txt ...
- paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中总结
paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中 xml读取通过jdk xml 初始化c3c0在代码中.. ... 作者Attilax 艾龙, EMAI ...
- EntityFramework IEnumerable,IQueryable ,Include
使用IQueryable using (var db = new CentaStaffEntities()) { IQueryable<Staff> queryablestaffs = d ...
- 如何在windows7上安装启明星系统。
启明星系统提供多种安装方式.安装包里自带了setup.exe.每个程序的 install下有在线安装(例如请假应用程序为book,则默认为 http://localhost/book/install ...
- 使用 Express 和 waterline 创建简单 Restful API
这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000004996659 突然想起来我这个博客冷落了好多年了,也该更新一下, ...
- Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Intellij IDEA 14的注册机
将以下代码保存成keygen.java import java.math.BigInteger; import java.util.Date; import java.util.Random; imp ...
- Python从内存中使用编译后的模块
在Windows编程的时候,有些时候,我们经常会要使用一些非常规的方法,比如说从内存中加载DLL,然后使用DLL中的函数.于是就思索在用Python的时候是否能够将几个编译好的Pyc合并成一个,然后使 ...
- [GraphQL] Serve a GraphQL Schema as Middleware in Express
If we have a GraphQL Schema expressed in terms of JavaScript, then we have a convenient package avai ...