5.5 数据结构和算法

1.数据的逻辑结构:

  1)线性结构:(只有一个开始结点和一个终端结点)

  2)非线性结构:(一个结点有多个前驱结点和后继结点)

    A: 集合:(元素之间的关系较为松散)                   B: 线性结构:(元素之间存在严格的一对一的关系)

    C: 树形结构:(元素之将存在严格的一对多关系)         D: 网状结构: (元素之间存在多对多关系)

2.数据的存储结构:

    A:顺序结构     B:连接结构      C:索引结构      D:散列结构

  对JAVA的集合的理解是相对于数组。数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型);JAVA集合可以存储和操作数目不固定的一组数据。

  所有的JAVA集合都位于 java.util包中,JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。

JAVA集合主要分为三种类型:  Set(集)  List(列表)  Map(映射)

  • List         =  排成一长队的小猪
  • Map       =  放在一个个,有房间号的屋子里面的一群小猪
  • Set         =  一群小猪贴上号,然后赶到一个猪圈里

Collection 接口

  Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List,Map没有)的通用方法。

Collection接口的方法:  (有一个工具类 Collections)

  •   boolean  add(Object o) :      向集合中加入一个对象的引用
  •   void  clear() :               删除集合中所有的对象,即不再持有这些对象的引用
  •   boolean  isEmpty() :         判断集合是否为空
  •   boolean  contains(Object o):   判断集合中是否持有特定对象的引用
  •   Iterartor  iterator() :          返回一个Iterator对象,可以用来遍历集合中的元素
  •   boolean  remove(Object o):    从集合中删除一个对象的引用
  •   Object[]  toArray() :          返回一个数组,该数组中包括集合中的所有元素

Iterator接口声明了如下方法:

  •   hasNext():  判断集合中元素是否遍历完毕(即是否还有下一个元素),如果没有,就返回true
  •   next() :     返回下一个元素
  •   remove():   从集合中删除上一个有next()方法返回的元素。

Set 的用法:

  存放的是对象的引用,没有重复对象

  Set set=new HashSet();
  String s1=new String("hello");   
  String s2=s1;   String s3=new String("world");  
  set.add(s1);   
  set.add(s2);  
  set.add(s3);
  System.out.println(set.size());//打印数目 为 2。

  Set 的 add()方法是如何判断对象是否已经存放在集合中?

   通过迭代器,遍历比较。

  • HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
  • TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
  • LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

List(列表)

  List的特征是其元素以线性方式存储,集合中可以存放重复对象。  List 的 get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。

最基本的两种检索集合中的所有对象的方法:

1: 用for循环和get()方法:                     2: 使用 迭代器(Iterator):
  for(int i=0; I < size; i++){                Iterator it = list.iterator();
      System.out.println(list.get(i));        while(it.hashNext){
  }                                                System.out.println(it.next);
                            }

List接口下一共实现了三个类:ArrayList(Java1.2才有)Vector(Java1.0就有)LinkedList

  • LinkedList采用链表数据结构,它一般主要用在保持数据的插入顺序的时候。插入和删除速度快,访问速度慢。
  • ArrayListVector都是用数组实现的,用于对元素进行随机访问,主要有这么三个区别:
    1.  Vector是多线程安全的,而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
    2.  两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的:Vector增加原来空间的一倍,ArrayList增加原来空间的50%
    3. Vector可以设置增长因子,而ArrayList不可以,最开始看这个的时候,我没理解什么是增量因子,不过通过对比一下两个源码理解了这个,先看看两个类的构造方法:

ArrayList有三个构造方法:

public ArrayList(int initialCapacity)        // 构造一个具有指定初始容量的空列表。
public ArrayList()                      // 构造一个初始容量为10的空列表。
public ArrayList(Collection<? extends E> c) // 构造一个包含指定 collection 的元素的列表  

Vector有四个构造方法:

public Vector()                          //使用指定的初始容量和等于零的容量增量构造一个空向量。
public Vector(int initialCapacity)            //构造一个空向量,使其内部数据数组的大小,其标准容量增量为零。
public Vector(Collection<? extends E> c)     //构造一个包含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)   //使用指定的初始容量和容量增量构造一个空的向量
/*
Vector比Arraylist多一个构造方法,capacityIncrement就是容量增长,即增长因子,ArrayList中是没有的。
扩容时,如果容量增量初始化的不是0,即使用的第四个构造方法进行的初始化,那么扩容的容量就是原来的容量加上容量增量的值;如果没有设置容量增量,那么扩容后的容量就是原来容量的二倍。
*/

Map(映射)

  是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。

  Map没有继承于Collection接口。从Map集合中检索元素时,只要给出键,就会返回对应的值对象。

Map 的常用方法:

  1 添加,删除操作: put()   remove( )   putAll(Map t)   clear()

  2 查询操作: get(Object key): 获得与关键字key相关的值

  Map集合中的不允许重复,也就说,任意两个键对象通过equals()方法比较的结果都是false。但是可以将任意多个键独享映射到同一个值对象上。

  • HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
  • LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
  • TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
  • WeakHashMao : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
  • IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。

# Android开发中高效的数据结构用SparseArray代替HashMap

  SparseArray是android提供的一个工具类,它可以用来替代hashmap进行对象的存储,其内部实现了一个矩阵压缩算法,很适合存储稀疏矩阵的。其内部实现了压缩算法,可以进行矩阵压缩,大大减少了存储空间,节约内存。此外它的查找算法是二分法,提高了查找的效率。

  List按对象进入的顺序保存对象,不做排序或编辑操作。Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet或者LinkedHashMap.

时间: 2024-10-05 05:31:54

5.5 数据结构和算法的相关文章

数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是<数据结构与算法C++描述>第三版,边学边做一些笔记.所以这些笔记中的代码有很多将会非常简单,甚至可能只有一个记录或者结论. 辗转相除法用来求两个整数的最大公约数,即能同时整除两个数的最大整数.程序如下: int gdc(int m,int n){ int rem; while(n!=0){ //

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

数据结构与算法(刺猬书)读书笔记----目录

最近在抓底层的语言基础,以前对数据结构和算法并没有太大感觉,但越往深处学就越觉得这些基础真的是要牢牢掌握住.一个简简单单的数组,深究起来都有很多学问.所以打算写个一系列的读书笔记,好好梳理一下这一块的基础知识.这本书是<数据结构预算法JavaScript描述>,是基于JavaScript的.里面大致介绍了数组.列表.栈.队列.链表.散列.集合及各种常见基础算法.作为基础读物算是很全面的.这系列读书笔记也将会跟着书里的顺序一章章的进行梳理.整个过程计划耗时2-3个月,每周更新一到两张,更新的笔记

Java数据结构和算法(一):综述

数据结构和算法能起到什么作用? 数据结构是指数据在计算机内存空间或磁盘中的组织形式.数据结构包括数组.链表.栈.二叉树.哈希表等等.算法对这些结构中的数据进行各种处理,例如,查找一条特殊的数据项或对数据进行排序. 数据结构的概述 数据结构 优点 缺点 数组 插入快,如果知道下标,可以非常快地存取 查找慢,删除慢,大小固定 有序数组 比无序数组查找快 删除和插入慢,大小固定 栈 提供后进先出方式的存取 存取其他项很慢 队列 提供先进先出方式的存取 存取其他项很慢 链表 插入快,删除快 查找慢 二叉

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

javascript数据结构与算法--二叉树(插入节点、生成二叉树)

javascript数据结构与算法-- 插入节点.生成二叉树 二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ /*用来生成一个节点*/ function Node(data, left, right) { this.data = data;//节点存储的数据 this.left = left; this.right = right; this.show = show; } function sh

数据结构与算法 第四次实验报告 图

数据结构与算法 第四次实验报告 姓名:许恺 学号:2014011329 班级:计算机14-1     中国石油大学(北京)计算机科学与技术系 1.图的定义,文件为"Graph.h" #ifndef GRAPH_H//定义头文件 #define GRAPH_H #include<string>//引入标准库中的头文件 using namespace std; const int MaxSize=12; struct ArcNode//定义边表结点 { int adjvex;/

数据结构与算法1

数据结构与算法(一),概述 转载请注明出处:http://www.cnblogs.com/wangyingli/p/5919297.html 数据结构学了有一年的时间了,但是一直没有好好的总结一下,现在回想起来,感觉好像都不怎么记得了.所以接下来一段时间我将重新学习一下,算是温故而知新了.本着「分享是一种美德」的精神,我将把我的学习总结记录下来,并与大家分享. 本节的主要内容有: 一.数据结构 1.定义 2.关于数据结构的几个术语 3.逻辑结构与物理结构 二.抽象数据类型 三.算法 四.算法的复

数据结构与算法

1. 解决一个复杂的问题的时候,肯能先想到的是如何建模,建模之后,怎么去求解这个问题.求解一个问题的时候,需要用到算法的时候,我们应该想到的是该算法需要什么样的数据结构.可能涉及一个算法最原始的数据结构,可能就比较复杂. 怎么样对一个算法来进行优化,我想从学完数据结构的角度来谈谈,总共有3个方面: 第一:可能就是算法本身,比如在排序过程中,我们知道快速排序在相对的情况下,要比冒泡排序更加高效,这就是为什么都是排序,我们为什么不选择好的算法,从算法本身来下手呢? 第二:可能就是合适的数据结构,能够