在很多数据结构相关的书籍,尤其是中文书籍中,常常把数据结构与算法“混合”起来讲,导致很多人初学时对于“数据结构”这个词的意思把握不准,从而降低了学习兴趣和学习信心。然而实际上,数据结构就是其字面意思:数据的结构。而“结构”这个词的标准意思又是“组成整体的各部分的搭配和安排”。所以,数据结构的意思就是“数据存储的结构”,而我们学习数据结构其实就是为了研究“应该以什么样的(抽象的)结构存储数据”。更广泛地说,数据结构不仅关心“数据如何存储”,还关心“存储哪些数据”。

那么,数据存储的不同结构(抽象的,因为数据的实际存储是物理的、底层的)会有什么区别,或者说我们为什么要学习数据结构呢?原因当然就是数据结构与我们的程序性能息息相关喽!为了举例说明这一点,我们先简要说明一下“链表”这种数据结构(后期会有相应文章讲解“链表”)。所谓“链表”,可以视作是“扩展的数组”,它与数组的不同之处在于其“元素”个数是不确定的(数组在创建时就需要指定大小,也就指定了元素个数),且“元素”间的位置也不再是相邻的。“链表”初始化后表内是没有“元素”空间的,当你需要添加元素时“链表”就在内存中随意找一个“元素”大小的空间加进“链表”中,然后写入数据到该空间。这样一来,“链表”就可以随着我们的需要动态地增大或减小其大小。至于为什么“元素不相邻却还能找到相关的其它元素”的原因,我们将在“链表”相应章节讲解,目前我们只需要知道其抽象概念及效果就好了。

现在,我们来假设一个程序(你也可以称为软件,可能会更高大上一点),其接收用户的输入,当输入完全结束后,进行相应操作,然后输出结果。但是,已知用户的输入数量是不确定的,有时候只需要1、2MB内存来存储,而有时候高达几百MB,并且用户的内存就只有1GB可用,那么程序设计时,如果使用数组来暂存用户的输入,这个数组该是多大呢?(C程序数组的大小是创建时确定的,所以如果使用数组完成这项工作,你不得不考虑这个数组该是多大)如果数组设置成2MB大小,那么程序将无法应对用户大量输入的情况,而如果将数组设置为比如500MB,那么有可能大部分情况下准备的空间都是浪费的!(如果只运行你这一个程序,浪费也就罢了,然而现在同时运行多个程序已经是常见的现象,若一个程序占用了过多的空间那么其它程序怎么办呢?)这个时候,显然“链表”才是该程序用于存储用户输入的更佳的数据结构。在特定的情况下,有的数据结构更合适而有的更不合适,我们要明白数据结构存在哪些选择,而哪个选择是更好的,才能写出更适合更优秀的程序。这就是为什么要学习数据结构的原因。

讲到这儿,数据结构的含义应该已经清楚了,接下来要说一说什么是算法。算法粗略地说就是“解决问题的方法”,而在编程中,我们解决问题往往就是处理数据(当然,广义的算法就是解决问题,比如先默认设置并进入下一步,有主动输入后再修改设置和必须输入后才完成设置进入下一步就可以说是两种算法,尽管它们与我们日后讨论的算法看起来不像是一种东西)。比如最常听说的排序算法,就是将数据处理成排好顺序的状态。很多时候算法的优劣决定了程序的性能,当数据个数为数万个时,使用插入排序算法可能需要耗费几十秒的时间,而快速排序算法则只需要零点几秒,这显然是有巨大差别的,且数据越多这两者差别越大。因此,算法对于编程是极其重要的!

那么,为什么数据结构与算法往往是一起讲解的呢?我们先好好地思考几个问题,然后应该就可以明白为什么了。首先,算法处理的是什么东西?显然是数据。那么数据是否需要被使用?毫无疑问是需要喽!那么,使用数据是不是就会用到算法呢?显然是的。想必这几个问题已经揭露了一个道理,就是:算法与数据是息息相关的。而数据的存储结构又是数据很重要的一项属性,所以我们说“算法需要有合适的数据结构支持,数据结构离开算法就没有什么意义”。基于这个原因,数据结构与算法往往都是要同时提起的。日后我们写的文章也会以提出某种情形——提出合适的数据结构——给出该数据结构相应的算法(比如链表),或者提出某种情形——提出合适的算法——选择合适的数据结构(比如二叉树)的形式来编排。

关于算法,还有很多其他需要了解的东西,比如时间复杂度、空间复杂度,但是限于篇幅,此处不予讨论,建议大家自己去了解,可以通过数据结构相关的书籍或是直接搜索相应的关键词。

深入浅出数据结构C语言版(1)——什么是数据结构及算法的更多相关文章

  1. 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度

    所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...

  2. 深入浅出数据结构C语言版(17)——有关排序算法的分析

    这一篇博文我们将讨论一些与排序算法有关的定理,这些定理将解释插入排序博文中提出的疑问(为什么冒泡排序与插入排序总是执行同样数量的交换操作,而选择排序不一定),同时为讲述高级排序算法做铺垫(高级排序为什 ...

  3. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  4. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  5. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  6. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  7. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  8. 深入浅出数据结构C语言版(5)——链表的操作

    上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游 ...

  9. 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

    在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...

  10. 深入浅出数据结构C语言版(4)——表与链表

    在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内 ...

随机推荐

  1. opp(Object Oriented Programming)

    嗯,昨天忙了一天没来及发,过年啊,打扫啊,什么搽窗户啊,拖地啊,整理柜子啊,什么乱七八糟的都有,就是一个字,忙. 好了,废话也不多说,把自己学到的放上来吧.嗯,说什么好呢,就说原型链啊 原型对象 每个 ...

  2. (一)Lua脚本语言入门

    今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入 ...

  3. ubuntu 压缩软件

    7-zip 安装: sudo apt-get install p7zip-full 使用方法: 7z x file file是你要解压的文件名 更多使用方法: man 7z rar sudo apt- ...

  4. mac下导出kindle单词本的单词

    平常都是用kindle来看电子书,偶尔也会看上一些英文书籍,不可避免的会遇到不少陌生的单词,而kindle专门针对这种需求,做了不少优化,可以直接在kindle上面查阅单词,甚至可以背单词.但是毕竟不 ...

  5. 《JAVASCRIPT高级程序设计》闭包

    一.闭包的概念 闭包是JAVASCRIPT中最重要的概念之一,闭包是指有权访问另一个函数作用域中变量的函数:创建闭包常见的方式,就是在一个函数内部,创建另一个函数.以下的例子创建了一个闭包,加粗的两行 ...

  6. svn conflicts: local delete, incoming delete upon update

    svn  st查看更新的时候发现存在conflicts,提示很多 local delete, incoming delete upon update , $:svn st ? C IMIRROR.T3 ...

  7. Python学习--16 正则表达式

    正则表达式是一种描述性的语言,用来匹配字符串.凡是符合规则的字符串,我们认为就是匹配了. 正则表达式并非Python独有的,它与语言无关.很多语言都支持正则表达式. 我们经常用正则表达式来匹配电子邮件 ...

  8. JavaSE 教程的选择

    你好 我是大福 你现在看的是大福笔记 又降温了 下点小雨 出门有点冷 走路到公司20多分钟,又走的有点热 昨天说到了,今年的计划是从零开始重新学习并梳理下这两年学习和接触到的技术 那么今天开始第一个知 ...

  9. input _文本框回车或者失去光标触发事件

    IE下,当一个HTML元素的属性改变的时候,都能通过 onpropertychange来即时捕获. onchange在属性值改变时还必须使得当前元素失去焦点(onblur)才可以激活该事件. 了解这一 ...

  10. ArcGIS制图技巧系列(1)还原真实的植被

    ArcGIS制图技巧系列(1)还原真实的植被 by 李远祥 在GIS数据中,植被一般都是面装要素的形式存在.很多人在使用植被渲染的时候,一般会采用填充符号去渲染.而在ArcGIS中,填充符号要么就是纯 ...