数据结构和算法 研究 (未完成)

原创 2007年12月26日 01:38:00
 



数据类型,其实就是数据的类型.用于描述数据.

我们平时接触的数学,1,2, 1.1 ,e,这些其实都是数据,它们在数学中有整数,实数,有理数,无理数的

区分.

 与数学中的是一样的道理,1,2...是整数,在计算机语言中,使用整型来描述,表示那些整数的数值,

e,1.1 ...这些数值在计算机语言中使用浮点型(也称为实型)来描述,表示那些实数的数值(在数学

,实数可以是任意的数值,但在计算机语言中,实型所表示的实数并不包括整数,因为整数已被子归

为整型)

浮点,这个词的意思是浮动的小数点,浮点型更准确的说,是表示小数点的数值.

在数学中,22.0都是表示整数,    但是在计算机语言中,2是整型,2.0却是浮点型.

在数学中,2/32.0/3的结果是一样的.

但是在计算机语言中,2/3的结果是0,     2.0/3的结果是0.6666....

为什么呢?

原因很简单,在计算机语言中,两个整型的数值相除的结果肯定是整型,

而这两个相除的数值中,只要有一个是浮点型,那么,结果肯定是小数,是浮点型的.

还有另外一类的数值,"", "" ,"" ,"你们" 等等.这些是字符或字符串.

在计算机语言中,charstring等类型来描述.表示字符或字符串.

上面说的这些数值只是最简单,最基本的数据,还有更复杂的,所以它们所形成的类型也称为基本

类型(也可叫做原始类型,Java中就是这么叫的)

Java为例,Java中有8种基本类型,其中整型有4,分别是int , short , long , byte,

浮点型有2,分别是float double ,

还有另外的两种是charboolean.

boolean是布尔类型,其实它只有2个值, false true

在现实生活中,其实经常会遇到真和假的判断,"这是真的吗"这样的语句,其实就是在作判断,

句话的答案里面包含判断后的结果真或假

不是所有的计算机语言中都有boolean类型,例如C语言中就没有.

有基本类型就一定有不基本的, 不简单的类型,因为根据对立统一的原理啊!

C语言中,复杂的数据类型是指针类型,结构,联合.

在面向对象语言中,C++,C#(C-sharp),Java,就包含有类,接口等.

接口只存在于Java语言中(没有学过C#,不知道这种语言有没有),其实它是抽象类.

它之所以会存在,原因在于Java中不允许显示的多重继承.即一个类只能有一个父类.

虽然只能继承一个抽象类,但是可以实现多个接口.由于实现(implements)其实就是继承

(extends),这就使得Java可以隐式的允许多重继承.

类是什么,这个问题曾经一直困惑着我,一直到有一天,我重读Java ,读到<Java编程思想>(第三版)

的时候,我明白了,现在我可以非常肯定的说类是用户自定义的数据类型.

首先类是一种数据类型.它与整型,浮点型一样,都是用于描述一些数据.

但是如果仅仅是一种数据类型,那么它没有多么大的价值.

类的价值在于用户自定义.

写程序的人可以根据实际要解决的问题自定义类,比如说人,我们可以写一个名称是Person的人类.

想想看,人可以有什么活动?有什么属性?

人可以有跑,说话,走等等这些动作,可以有身高,体重,年龄,性别等等这些属性.好了,

这些属性和动作就是一些比较复杂的数据了.如果用基本类型来描述,估计可行性不大,实际上应

该说是不可能的.因为这些数据是自定义的

编程人员一直在找可以很好的描述这些数据的一种类型.终于,编程人员找到了,没有错,他就是类.

 

在写这个人类的程序的时候,我们其实是把人当成一个对象来研究.我们去找出人这个对象身上所

具有的数据,然后找到类这样一个数据类型,来描述这些数据.

因此,我们所研究的对象具有属性和动作(动作也可以称为状态)

在研究人这个对象时我们使用了抽象.我们忽略人内部的一些东西.比如说新陈代谢,人内部的蛋

白质,,脂肪等这些东西.我们不去考虑它们.

人并不会因为不知道自己内部的新陈代谢而不会走,

也就是说,人的这些内部的东西并不会影响到人所具有的属性和动作.

我们把这些对属性和动作不会有影响的忽略掉,不去考虑.

 

"万特皆对象"

我个人认为,其实"万特皆对象"只是说出了面向对象语言本质,其实真正的应该是"万物皆数据"

在计算机中,一切一切的东西都与数据有关.

 

以上面的人类的例子为例,人所具有的属性如身高,体重,年龄,本身就是一些数据,所以必须用

一些数据类型去描述,想想看,身高用什么类型去描述呢?来看看一些关于身高的具体数据,如

1.73m , 2.26m 1.65m 等等,

哈哈,你应该猜测到了吧,没错,应该用double来描述.

至于体重与年龄也可以找到double来描述.

 

属性是一种数据,它具体包含身高,体重,年龄这样一些东西,而这些东西是可以用基本数据类

型来描述。

也就是说,类描述属性和动作这两个大的数据,而属性下的所具有的数据(如身高,体,年龄)

则可以由基本数据类型来描述,这有点类似于软件工程中自顶向下的思想。

 

从我们要解决的问题(如写人类这样一个程序),这是一个大的,处于顶层的东西,然后我们找

到(人身上所具有的)数据: 属性和动作,接着,属性下的数据,就可能性以用基本数据类型

来描述.

 

到了第层的时候,身高,体重,年龄这些模块(即数据)已经无法分解,那么就直接去实现

(在这里实现即描述的意思)这些数据。

在这里实现的方式应该是基本数据类型。因为基本数据类型是不可在分解的。(在软件中,实现

模块的方式应该是程序)

动作下的操作(走,跑,说话)应该怎么分解呢,我还没想到。。。。。

如上图所示的,身高,体重,年龄已经是无法在分解的模块,那么我们实现这些模块,再把它们

全部拼接(或称合并)起来,之后,也就实现了属性这一个较大的模块.

 

 变量是用于存储数据的容器,当定义了一个变量,在内存中也就有一个具体的物理地址(可以理

解成容器)

这个容器的容量是多大呢?要看这个变量的数据类型。如果是int类型,就有可能是4字节(Java

中,int4字节的)或者是2字节的。

有的时候,不一定就只需要一个容器,可能需要多个容器,为了区分这些容器,为每个容器取一

个名字,这个名字就是定义变量时所取的变量名.

 

变量的作用是存储数据,那么怎么将这些数据放入容器呢?

我的回答是赋值运算。

举个例子,

int a;

a=4;

第一条语句定义了一个变量,变量名是a.

第二条语句进行赋值运算。

当执行完第二条语句后,4这个整数也就被放入到a变量这个容器中了.

 

想想看,当把一个浮点数,4.4, e 这些数字放入a变量呢?

不好意思,系统提示:“这些值是双精度类型的,double类型为8字节,而int只有2字节或

4字节,无法完全放入,只好溢出一部分值”.

那么溢出什么值呢?

可以知道int是用于描述整数的,那么按照这样子讲,int类型的变量只能容纳整数。

可以看的出来,浮点数,4.4 ,e ,这些都是由整数和小数构成的(两者之间加一个小数点)

问题就好解决了,保留整数的部分,去除小数的部分.

 

 
 
 
 
 
 
 

 

今天(2008-1-13)看了<Java数据结构与算法(第二版)>,不禁对算法这个东西产生了一些想法,特写下来,

是为了交流心得,二是希望大家多批评指正(因为本人是初学者)

 

算法,就是计算的方法,正如数学中的解题过程一样(或者说中国古代的数学中的解方程),每解一

道数学题目(我想应该写数学问题更准确一些),都一定会有一些解题

步骤,比如说,分析题意,确定题中的数据间的关系,列出一些关系式等等,这些都是解题的步骤(

称方法).而整个解题的步骤也就是我们所说的算法.

 

要进行一些计算,就必须有数据,就好像解数学题目一样,

给定一些已知数据,找出已知数据与所求数据的关系,最后就能够求出未知数据。

建立数据之间的关系也就是数学中的解方程。

 

算法可以理解为使用一些数据进行运算的方法。

它是对数据进行的一种处理。既然是一种处理,那肯定是要得到另外一些有用的数据。

 

没有数据,也就没有什么运算而言,也就不会有什么算法。

算法就是使用数据结构中的数据进行一些运算。

当然这个运算是可以简单的算术运算,也可以是复杂一些的排序,查找算法。

 

数学(Mathematics)中的数就是指数据,而字就是算法”.

代数其实应该算是我们的老祖宗们发明的,而几何则是源自西方。

 

数据结构则是对一些数据进行的安排。将数据以一种什么样的形式组织起来,可以方便我们使用以及存储。

我们研究数据结构的目的是为了“存储“两个字。

 

最常用的数据结构是数据类型和变量,以及数组。

数组(Array)其实是一种有序集(ordered set)。

另外常用的一些就是集(Set),队列(Queue),列表(List)

 

数据结构与算法分别是对数据的安排和处理。所以它们都会使用到数据。

 

实际上,人们最早发明计算机的时候,只是让它能够进行一些算术运算。

 

例如 ,一个简单的算术题[(1+3)×7÷2]×45

这道题应该学过数学的人都知道怎么做,它的分析步骤如下:

.分析先计算什么.这相当于计算机语言中的优先级高低的判断.找出优先级高的与优先级低的,

高优先级的运算符先计算,低的后计算.

在这个例子中,( )的优先级最高,次知的是×和÷(在计算机语言中分别用*/这两个运算符号表示),

最后的是+和-.

在计算机语言中,[]这个符号的含义是与数学的不一样的,上面算术题中的[]符号使用数学中的常

用的数学符号,实际上表示的是()的含义

 

.由于()的优先级最高,首先计算( )内的值,最终计算1+3的结果是4.

 

.接着计算(1+3)×7÷2的值.即计算4×7÷2的值.

在这里×和÷这两个符号是处于同一优先级的,那么是先计算×还是÷呢?(C语言中,×和÷的优先级是4)

解决的方法是运算符的运算顺序.

很明显,×和÷都是从左到右进行运算的.

最后,得到运算的结果是14

 

在计算语言中,7÷2的结果只能是3,而不是3.5.因为72都认计算机认为是整数,使用整型来描述,所以两个整型数值相除的结果是整数.

 

.将上一步得到的结果×4 ,得到56

 

.将上一步得到的结果-5,得到51

 

以上所描述的基本上是是这道算术题的整个计算的步骤.

 

在上面的步骤可以体现出一点,后一步都会应用到前一步得到的结果.例如,第三步就应用第二步

得到的结果4进行新的计算.

 

 

也许有人看这这篇文章(老实说,我的文章很少有人看啊),会臭骂我一顿,这么简单的计算题谁

不会啊!

 

但是我这里只是举了一个最简单的例子(本人技术水平差,也只能举这么简单的例子了).

在计算机中,往往要面对的是更加复杂的问题

 

就是有这样一个复杂的问题-------现实世界中的东西怎么转化为计算机中表示.

 

例如,怎么在计算机中存储一些数据.

这些数据往往是现实世界中经常用到的.

 

比如,银行卡号一样,它往往能正确反映出某人拥有多少金额,而卡上所显示的数字只不过是一个虚

拟的数字.

需要能够将卡中的虚拟的数学转化为现实中我们使用的人民币,美元等这些货币.这个过程通称为

取款.

这个过程的问题是怎么将计算机所显示的虚拟的数字(用于表示金额数目)转化为现实中的货币(

币也通称为money,)

 

除了取款,还有存款,怎么将现实中的货币转化为计算机中的表示.

 

 

算法是对数据的处理.

 

怎么对一些杂乱无章的数字进行有规律的排列(如从小到大或从大到小的顺序排列)

这将会使用到排序(算法)

 

怎么在一些杂乱无章的数字中查找一个指定的数字,这使用到查找(算法)

 
数据结构是一种数据的存储方式,而算法则是对数据的操作,处理,运算等。
我们平时在计算机中所见到的汉字,英语等这些字符,其实都是常见的数据,这些数据都存
储在计算机的存储器(内存,硬盘,磁盘)中。
如果光有数据的存储,而没有对这些数据进行一些运算、操作,那么计算机只是一个存储器。
那么计算机就不能干任何事情(包括上网,看电影等)。计算机就只是一个单纯的硬件。那
计算机就是没有软件的硬件.
 
数据结构研究的是怎么以最好的方式存储数据,以方便人们管理。
这只是从物理上的数据结构来说的,而逻辑的数据结构则是反映了数据的内部构成,即数据由哪
些成分数据构成,以什么方式构成,呈什么结构。
逻辑的数据结构是一种理论,物理的数据结构则是一种实践。
在理论上,我们可以提出数组,栈等这些由人类的大脑所定义,所想像的数据结构,但是在存储器

存储这些数据又是另外一回事了。
举个例子,数组是一种非常简单的数据结构,它在逻辑上是一张表格,而在物理上却不是如此。
因为存储器被划分成若干存储单元,每个存储单元从0开始编号(一个存储单元存储1字节的
二进信息)。如图1所示。
正因为如此,存储器不是表格的结构,如果要实现二维,三维以及N维的数组就有些麻烦了。
所以必须转换。
以二维数组int a[4][5] 为例,它是一张45列的表格,如图2所示。
       图1

 

                              2
 
 
算法研究的是怎么以最好,最快,最简单的方法使用,操作,处理数据,来得到我们想要的结果
(如数据).
这就好像是解方程。利用一些已知的数据求解方程得到另外一些未知的数据。
而解决问题的过程(或方法)就是算法。
在计算机中,算法具体是由指令实现的,指令是由01两个数字构成的组合。
而数据在计算机中具体体现为01这两个数字构成的数据。
在存储器中,指令和数据并没有任何区别,都是由01这两个数字组成的二进制信息,它们
只是应用上的概念。
指令的作用是可以执行某些操作。比如读取数据和写入数据的操作。
 
数据结构有物理上和逻辑上之分,不烦把算法也做这样的区分。
物理上的是运算器和控制器去实现,而理论上的则是我们人类用纸和笔所研究出的算法,
比如说,在数学中,解一元二次方程有4种,分别是直接开平方法,因式分解法,配方法,公式法
这些方法就可以理解成逻辑上的算法。
而计算机要想求解一元二次方程的话,我们只能使用一种最通用的方法。这就是公式法。
 
CPUCentral Processing Unit ,中央处理单元)主要是由运算器和控制器这两个部分构成的(当

还有高速缓存)
运算和控制其实都是两种对数据进行的操作。所以说CPU这个硬件实现了我们所说的算法。
存储器的作用是存储数据。它实现了物理上的数据结构。
 
我们撇开声卡,显卡,光驱等其他的硬件不谈,CPU与存储设备这两个硬件其实就可以组成一个

简单的计算机。
只不过这个计算机是没有声音,没有图像的计算机。
世界上第一位的程序员艾达(Ada,女性)所研究的分析机其实就是由输入,输出,存储器,处理
器,控制器等组成的,其中处理器与控制器合在一起就是CPU
 
算法其实也隐含了输入,输出的概念。要使用算法必须要有一些数据,那么CPU怎么才能得到这
些数据,其中的一得种方法是输入。而要得到的结果进行输出才能被人们知道结果是什么。
 
根据 数据结构+算法=程序这个定理,可以推理出”CPU+存储器=计算机的公式。
当然这个公式中的计算机并不是指现代的PC机,笔记本电脑等。它只是指像分析机这样的机器。
 
我们都知道,其实程序说简单的一些就是由计算机语言实现的。
所以说,从数据结构+算法=程序这个定理,也可以推理出数据结构+算法=计算机语言
这样的公式,从严格来说,推理出的这个公式并不一定是完全正确的,但是至少我们基本上可以
按照这样去理解(希望不会被人说成是误人子弟啊!
这个公式的意思是说,无论是多么高级的计算机语言,我们都可以数据结构和算法的身影。
计算机语言都由数据结构和算法构成的。
汇编语言中的算法其实就可以体现为指令,严格地说,算法是由若干条指令组成的有序序列。

C , C++ , C# , Java 这些高级语言中,基本都有数据类型,变量,数组等,而这些就是数据结构的一部

分。

算法的三种基本结构:顺序,选择,循环。

在这几种语言中也都有。甚至连SQL这样的数据库语言也有这三种结构.

虽然说不同语言中这三种结构的语句结构有可能会不同,但是它们的算法是相同的。

 

 

C语言中是很容易找到数据结构和算法的身影,但在Java中却不然Java API中的java.util

包中定义了一系列的常用的数据结构的实现类,这些类合在一起就是Collection (集合类) 。而集

合类与对应的Collection接口就构成了Java的集合框架。

这些常用的数据结构包括表(List),链表(LinkedList),队列(Queue),优先级队(PriorityQueue)

(Tree),动态数组(ArrarList),(Set)等。

 

可以直接创建这些类的对象,并使用这些类中的方法很方便的用Java实现这些数据结构,而无需

去研究这些数据结构的具体实现方法,也不需去关心实现这些数据结构的整个过程。你所要做的

是怎么去记忆这些类和方法,怎么去使用这些类和方法。

这样做,的确会使Java变得非常方便,非常简单,但是对理解数据结构和算法,学习数据结构和

算法有很大的不利。这样做的结果是将整个的实现方法和实现过程都隐藏起来了,

所以数据结构和算法最好是使用C语言来描述。因为使用C语言,你会非常清楚的知道这些数据结

构的整个实现方法及实现过程。

 

以上所说的实现方法和实现过程其实就是算法。

我们定义了一种数据结构(如堆栈),这些只是纸上,笔头上所定义的东西,要让计算机理解,

就必须使用计算机语言去实现这些数据结构,这样子,就必须去研究实现的方法。

在计算机语言中,数组一般是可以直接声明,定义的,而其他的数据结构(如堆栈)却不能。这是

因为数组的逻辑结构是一张表格(或数学中的矩阵),这样的结构与存储器的结构是是接近的。这

样,我们只要将这张表格进行一些简单的处理就可以很好的存储在存储器中。

而像堆栈,它的特点是先进后出(队列的是先进先出),而存储器并不满足这样的特点。


说简单一些,算法研究的是怎么做(或称处理),做的方法,做的过程。

没有数据结构,也就不需要算法,没有算法,数据结构则永远只是纸上,笔头上所定义的数据结

构,计算机语言永远无法理解这些数据结构.

 

 


 
 
 
计算机的本质在于01这两个数字构成的二进制,而计算机语言的本质在于数据结构和算法。
在计算机中,有三门专业是最难学的,它们分别是编译原理汇编语言数据结构和算法
高级语言的源程序必须翻译成机器语言(由01构成的)后,才能被计算机识别,最后执行,得出结果。
翻译有两种方式:解释和编译。
编译原理是研究怎样将高级语言转化成机器语言的方法。
汇编语言是直接和硬件打交道的,所以说,在学这门语言前,必须先学计算机组成原理,深入的理解
和掌握计算机的硬件组成以及各种硬件的作用等等。
举个例子,CPU从存储器读取或写入数据,这需要用到总线。
在物理上说,总线是一根根的导线,其实就是我们平时生活中所常见的电线。
在逻辑上,我们可以根据总线的作用分成地址总线,数据总线,控制总线。
所以说,肯定需要知道总线是什么,对总线有一个深入的理解。
数据结构和算法中,最难学的应该是算法。
 

书籍一般都是按章节这样的形式来组织的。

一般的,一章下有若下个小节,而小节下又有若干个小点,我们可以用1,2,3. . .这些数学来表示第一章,二章,三章,. . .  1.1来表示第一章的第一节,1.1.1表示第一章第一节第一点。

也有的书籍是分成几个部分,然后要有几个章是在这个部分的

其实这样的结构正是数据结构中常见的树(Tree)

以章为根结点,节为它的子结点,点作为节的子结点,不断下去,. . . . . .

 
画成的图是这样的
 
http://www.best4c.com/Best4cUserFiles/20080402/17143_1207113093949.jpg

 

为什么这样的结构称为树,因为它倒置的形状很像我代产平时生活中常见的树的形状。

看下图,CHM电子书的目录窗口中常见的结构。

可以看到在Ada 95 Reference Manual这本书籍下的第3,3.2节,中有3.2.1 3.2.2 3.2.3 这三个小节。

这其实就是运用到了树。

一段XML代码(使用XMLwriter 2.7编译)

<?xml version="1.0" encoding="gb2312"?>
<学生列表>
     <学生>
        <学号>200120101</学号>
        <姓名>季慧奇</姓名>
        <性别>女</性别>
        <班级>01信管1</班级>
        <出生年月>1985-1-2</出生年月>
     </学生>
     <学生>
        <学号>200120102</学号>
        <姓名>凌怡</姓名>
        <性别>女</性别>
        <班级>01信管1</班级>
       <出生年月>1983-6-20</出生年月>
     </学生>
</学生列表>
 
以树型视图查看:

  在窗口中预览:

 

以树型视图查看的结果是不是与电子书的结构很像呢。
在XML代码中的<学生列表>其实可以理解成根结点,而<学生>可以理解成其下的子结点;<学号>,
<性别>,<姓名>这些又是<学生>下的子结点
画成图是这样子的:

 


未完成.....
 
 
 

 

 

 

 

相关文章推荐

C++培训_007_指针地址内存_数据结构_文件操控(未完成)

1.指针。 2.函数指针。 3.二级指针。 4.register,const修饰。

数据结构 [未完成 待续~待修改]

ACM基本数据结构

学习研究v_JULY_v整理的微软数据结构和算法面试题

2014年4月15日 晚上

数据结构:快速排序算法的研究

  • 2009年08月10日 18:19
  • 338KB
  • 下载

高级数据结构研究-B树系列以及红黑树

程序员做的越久,越发觉得基本功显得越来越重要了。基本功不扎实会潜移默化的影响你的程序开发,这不是,上次浏览博客,看到了一篇运用B+树实现数据库索引的功能,当时就不明白了,看似毫无关系的两者,怎么会有联...

数据结构之图的邻接矩阵BFS(参考C博客—研究毛)

#include using namespace std; #define QSIZE 20 #define MAXVEX 30 typedef char VType; typedef int ETy...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构和算法 研究 (未完成)
举报原因:
原因补充:

(最多只允许输入30个字)