忍耐和坚持虽是痛苦的事情,但却能渐渐地为你带来好处。 ——奥维德

一、学习目标

· 回顾在计算机科学、编程和问题解决过程中的基本知识;

· 理解“抽象”在问题解决过程中的重要作用;

· 理解并实现抽象数据结构;

· 复习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讲解数据结构与算法] 关于数据结构和算法还有编程的更多相关文章

  1. [0x00 用Python讲解数据结构与算法] 概览

    自从工作后就没什么时间更新博客了,最近抽空学了点Python,觉得Python真的是很强大呀.想来在大学中没有学好数据结构和算法,自己的意志力一直不够坚定,这次想好好看一本书,认真把基本的数据结构和算 ...

  2. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  3. 使用python解决算法和数据结构--使用栈实现进制转换

    可以将10进制数据转换成2进制,8进制,16进制等. 晚上练练算法和数据结构哈. # coding = utf-8 class Stack: def __init__(self): self.item ...

  4. python算法与数据结构-算法介绍(31)

    一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...

  5. 【机器学习】【条件随机场CRF-2】CRF的预测算法之维特比算法(viterbi alg) 详解 + 示例讲解 + Python实现

    1.CRF的预测算法条件随机场的预测算法是给定条件随机场P(Y|X)和输入序列(观测序列)x,求条件概率最大的输出序列(标记序列)y*,即对观测序列进行标注.条件随机场的预测算法是著名的维特比算法(V ...

  6. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  7. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  8. 【数据结构】 字符串&KMP子串匹配算法

    字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存 ...

  9. 用Python开始机器学习(2:决策树分类算法)

    http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树 ...

随机推荐

  1. Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结

    Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...

  2. 前端开发-Weex初试

    1 Weex介绍 weex是阿里2016年开源的一套跨移动端(Andriod/IOS/Wap)的前端框架,采用VUE,较React Native入门相对简单 官网地址 2 Weex安装与初始化 2.1 ...

  3. 今日例子border

    border这个属性在页面上的使用率还是很高,例如我们需要理解的盒模型就需要对border有个 比较深的理解,如果你会盒模型,但对border没有深的理解,那只能说你只是知道盒模型,而 不是懂得盒模型 ...

  4. UIBarButtonItem-添加自定义Left或者Right按钮

    为UINavigationController添加UINavigationItem,我们可以这样写:   1.添加返回导航按钮backBarButtonItem   1.用系统自带的返回按钮 UIBa ...

  5. RFID 仿真/模拟/监控/拦截/检测/嗅探器

    Sound card based RFID sniffer/emulator (Too tired after recon.cx to do draw the schematics better th ...

  6. 如何实现在H5里调起高德地图APP?(上)

    这一篇文章,将讲述如何在H5里调起高德地图APP,并展示兴趣点.适合于展示某个餐馆,商场等,让用户自行选择前往方式. 场景一.在高德地图上展示Marker点或者POI标记 在一些基于位置分享的应用开发 ...

  7. 跨平台web调试代理工具---whistle

    whistle是基于Node实现的跨平台web调试代理工具,支持windows.mac.linux等所有安装了Node的操作系统,可以部署在本地机器.虚拟机或远程服务器,并通过本地网页查看或修改HTT ...

  8. [算法导论]哈希表 @ Python

    直接寻址方式: class HashTable: def __init__(self, length): self.T = [None for i in range(length)] class Da ...

  9. HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    导致这个错误出现的原因是因为.net Framework4.0没有注册 解决方法:打开运行命令行,运行下面的命令: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30 ...

  10. 【组合数学+动态规划】在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。

    在如下8*6的矩阵中,请计算从A移动到B一共有__种走法.要求每次只能向上或向右移动一格,并且不能经过P. A:456 B:492 C:568 D:626 E:680 F:702 解析: 8*6的矩阵 ...