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

一、学习目标

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

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

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

· 复习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. Leetcode 88 Merge Sorted Array STL

    合并有序数组 时间复杂度O(m+n) 该算法来自各种算法与数据结构书,写得已经烂得不能再烂了,这个应该是最短的代码了吧,不知如何归类 class Solution { public: void mer ...

  2. js模块方案

    在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道js哪个模块会先加载,所以传入的返回函数除了返回函数本身,还可以返回为空对象. 自执行函数的处理方式: var module1 = (f ...

  3. 24单行插入与批量插入-insert(必学)-天轰穿sqlserver视频教程

    大纲:insert语句,简单插入数据与批量插入数据 为了冲优酷的访问量,所以这里只放优酷的地址了,其实其他网站还是都传了的哈. 代码下载http://www.cnthc.com/?/article/1 ...

  4. 用ColorMatrix將Bitmap轉成灰度图

    在Android中,若想將整張圖片轉成灰階效果其實有更簡便的方式,只要透過ColorMatrix類別的setSaturation函式將飽和度設為0即可.(您也可以試試從0~1之間的值,看看不同飽和度的 ...

  5. 创建一个Windows的NTP Server

    搭建一个VMware vRealize Suite的时候遇见了不少时间同步的问题, 实验室里网络与外界隔绝, 不能使用公网的NTP服务器, 所以使用文中的方法自己搭建了一个. 蛮好用的. Creati ...

  6. Javacript和AngularJS中的Promises

    promise是Javascript异步编程很好的解决方案.对于一个异步方法,执行一个回调函数. 比如页面调用google地图的api时就使用到了promise. function success(p ...

  7. 微信、陌陌等著名IM软件设计架构详解

    对微信.陌陌等进行了分析,发出来分享一下(时间有些久了) 电量:对于移动设备最大的瓶颈就是电量了.因为用户不可能随时携带电源,充电宝.所以必须考虑到电量问题.那就要检查我们工程是不是有后台运行,心跳包 ...

  8. css/js在线压缩工具

    http://tool.css-js.com/ 在进行前端的时候,可以参考百度性能监控中心给出的意见: http://developer.baidu.com/apm/index

  9. offsetWidth、clientWidth、width、scrollWidth区别及js与jQuery获取的方式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. MySql 执行语句错误 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    关于用Power Designer 生成sql文件出现 错误  [Err] 1064 - You have an error in your SQL syntax; check the manual ...