这几天正好辞职,在家闲着读书,感觉自己数据结构与算法这块始终是一个弱项,所以就以博客的形式记录自己重读经典的过程。水平有限,文中不免出现谬误,还请阅读本文的童鞋指正。每个抽象数据结构都会以三种强类型语言C、C++、Java实现

  引子中将强类型这个词设置成了粗体,主要是因为我想从这个话题开始讨论关于语言及与语言不相关的抽象数据类型。
  那么何为类型,类型存在的意义是什么?何为强类型呢?

  要回答这个问题,我们需要从编译器、内存分配的角度去考虑。众所周知,在计算机的世界里,操作的所有data都是用0与1的组合表示(内存或者磁盘中),0或者1又是以一个bit存储的,8个bit又组成了1个byte....为了确定一个数据由多少个0与1组合而成,即为了确定某个数据占用多少个bit,就有了如下的示意图:


   191122749.png

站在编程语言的角度类型存在的意义有两点:
  1.编译器在编译期需要确定某个数据占用多少个存储单元,便于运行期分配内存。
  2.站在程序员的角度,类型可以用来表示现实世界存在的事物。
所以所有的强类型语言都会规定数据类型由多少位多少字节来存储,如c的int类型。
这就引申出各种强类型语言的基本数据类型、抽象数据类型占用存储单元的长度问题,试想如下问题:
   int array[10];
   该数组占用多少内存呢?
   (需要考虑特定语言及特定编译器)
明白了以上问题,我们接下来讨论抽象数据类型(ADT)。
   首先,需要明确,什么是抽象数据类型?
   用我自己的话来说来说就是由基本数据类型组成的数据类型,如一个一维的整型数组。
   抽象数据类型存在的意义在于,当我们要解决特定问题时,抽象数据类型可以为我们提供合适的存储形式及检索方法。
   其次,针对一个问题,如何选择最合适(从算法的空间复杂度与时间复杂度去考虑)的数据结构呢?
   一组数据加载到内存后只进行简单的查询(不考虑大量数据的极端情况),那么从算法的角度来说我们选择线性表较为合适;
    该组数据需要插入或删除某些数据,选择链表比较合适。
    在处理大数据时,hash表又成了一个很好的选择。
    ...

1.线性表:一块连续分配的存储单元
    对线性表的所有操作都可以通过数组来实现,这里就不做讨论了。
2.链表:为了避免线性表的插入及删除的线性开销,我们需要允许表可以不连续存储,所以就有了链表的一般想法:


每个节点持有一个指向下一个节点的引用或者指针,使整个表结构呈现出一个链条的形式。