八种数据结构特点
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八种数据结构特点相关的知识,希望对你有一定的参考价值。
参考技术A 数据结构:计算机存储、组织数据的方式。程序员的目标是为当前的问题选择最优的数据结构。八种数据结构:数组,栈,链表,队列,堆,图,树,散列表,每种数据结构都有其特殊的存储方式。
概念:
一维数组:数组元素+数组索引
多维数组:数组的元素也是数组
基本操作:insert,get,delete(删除某个索引处的数组),size(获取数组长度)
题目:
查找数组第二小的元素
查找第一个没有重复的数组元素
合并2个排序号的数据
重新排列数组中的正数和负数
特点:栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出。栈中的元素采用LIFO (Last In First Out),即后进先出。
基本操作:Push(栈顶插入元素),Pop(返回栈最上方的元素,并删除),isEmpty(查询栈是否为空),Top(返回最上方元素,并不删除)
题目:使用栈计算后缀表达式、使用栈为栈中的元素排序、检查字符串中的括号是否匹配正确
使用场景:栈常应用于实现递归功能方面的场景,例如斐波那契数列。撤回,即Ctrl+Z,是我们最常见的操作之一,大多数应用都会支持这个功能。你知道它是怎么实现的吗?答案是这样的:把之前的应用状态(限制个数)保存到内存中,最近的状态放到第一个。这时,我们需要栈(stack)来实现这个功能。
概念:队列(Queue)与栈类似,都是采用线性结构存储数据。它们的区别在于,栈采用LIFO方式,而队列采用先进先出,即FIFO(First in First Out)。
使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。
基本操作:Enqueue—在队列末尾插入元素,Dequeue—将队列第一个元素删除i,sEmpty—查询队列是否为空,Top—返回队列的第一个元素
习题:使用队列实现栈,倒转队列的前K个元素,使用队列将1到n转换为二进制。
概念“链表(Linked List)也是线性结构,它与数组看起来非常像,但是它们的内存分配方式、内部结构和插入删除操作方式都不一样。链表是一系列节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头指针指向第一个节点,如果链表为空,则头指针为空或者为null。链表分为:单向链表,双向链表。
使用场景:链表可以用来实现文件系统、哈希表和邻接表。
基本操作:InsertAtEnd—在链表结尾插入元素,InsertAtHead—在链表开头插入元素,Delete—删除链表的指定元素,DeleteAtHead—删除链表第一个元素,Search—在链表中查询指定元素,isEmpty—查询链表是否为空
题目:倒转1个链表,检查链表中是否存在循环,返回链表倒数第N个元素,移除链表中的重复元素
概念:图(graph)由多个节点(vertex)构成,节点之间阔以互相连接组成一个网络。(x, y)表示一条边(edge),它表示节点x与y相连。边可能会有权值(weight/cost)。
分类:无向图,有向图
表现形式:邻接矩阵(Adjacency Matrix),邻接表(Adjacency List)
遍历图的两种算法:广度优先搜索(Breadth First Search),深度优先搜索(Depth First Search)
常见题目:
实现广度优先搜索,实现深度优先搜索,检查图是否为树,统计图中边的个数,使用Dijkstra算法查找两个节点之间的最短距离。
树(Tree)是一个分层的数据结构,由节点和连接节点的边组成。树是一种特殊的图,它与图最大的区别是没有循环。树被广泛应用在人工智能和一些复杂算法中,用来提供高效的存储结构。
常见树:N叉树(N-ary Tree),平衡树(Balanced Tree),二叉树(Binary Tree),二叉查找树(Binary Search Tree),平衡二叉树(AVL Tree),红黑树(Red Black Tree),2-3树(2–3 Tree)
题目:计算树的高度,查找二叉平衡树中第K大的元素,查找树中与根节点距离为k的节点,查找二叉树中某个节点所有祖先节点。
哈希(Hash)将某个对象变换为唯一标识符,该标识符通常用一个短的随机字母和数字组成的字符串来代表。哈希可以用来实现各种数据结构,其中最常用的就是哈希表(hash table)。
哈希表通常由数组实现。
哈希表的性能取决于3个指标:
哈希函数哈希表的大小哈希冲突处理方式
题目:查找数组中对称的组合,确认某个数组的元素是否为另一个数组元素的子集,确认给定的数组是否互斥。
前缀树(Prefix Trees或者Trie) 与树类似,用于处理字符串相关的问题时非常高效。它可以实现快速检索,常用于字典中的单词查询,搜索引擎的自动补全甚至IP路由。
参考资料: http://www.cnblogs.com/williamjie/p/9558015.html
数据流: DataInputStream 和 DataOutputStream
/*
* 1、数据流: DataInputStream 和 DataOutputStream 一对。
* 1) DataInputStream 数据的字节输入流; DataOutputStream 数据的字节输出流。
* 2) 功能: 实现八种基本类型数据的输入/输出。 同时,也可实现字符串的输入/输出。
* 3) 特点: 八种基本类型的数据在输入/输出时,会保持类型不变。
* 因此,这种流特别适合在网络上实现基本类型数据和字符串的传递。
*
* 4) 方法:
* readByte() writeByte()
* readShort() writeShort();
* readInt() writeInt();
* readLong() writeLong();
* readFloat() writeFloat();
* readDouble() writeDouble();
* readBoolean() writeBoolean();
* readChar() writeChar();
*
* readUTF(); writeUTF();
*
* 5) 数据流属于处理流,它必须套接在节点流。
*
* 6) 注意: 数据流在读取与存储时的顺序要一致。否则,读取数据会失真。
*/
public static void main(String[] args) { byte b1 = 127; short s1 = 32767; int i1 = 2147483647; long l1 = 9876543210L; float f1 = 31.78f; double d1 = 3.1415926; char ch = ‘A‘; boolean flag = true; String str = "Hello"; String path = "d:/datas.dat"; //2 声明 DataOutputStream dos = null; DataInputStream dis = null; //3创建 try { dos = new DataOutputStream( new FileOutputStream( path) ); dis = new DataInputStream( new FileInputStream( path ) ); //4 存盘 dos.writeByte( b1 ); dos.writeShort( s1 ); dos.writeInt( i1 ); dos.writeLong( l1 ); dos.writeFloat( f1 ); dos.writeDouble( d1 ); dos.writeChar( ch ); dos.writeBoolean( flag ); dos.writeUTF( str ); //5 确保输出成功 dos.flush(); System.out.println("已将八种基本类型的数据及字符串存盘到 " + path + "文件中了。"); //6从文件中读取八种基本类型的数据及字符串 b1 = dis.readByte(); s1 = dis.readShort(); i1 = dis.readInt(); l1 = dis.readLong(); f1 = dis.readFloat(); d1 = dis.readDouble(); ch = dis.readChar(); flag = dis.readBoolean(); // str = dis.readUTF(); System.out.println("\\n从 " + path + " 文件中读取八种基本类型数据及字符串如下:"); System.out.println("b1 = " + b1 ); System.out.println("s1 = " + s1 ); System.out.println("i1 = " + i1 ); System.out.println("l1 = " + l1 ); System.out.println("f1 = " + f1 ); System.out.println("d1 = " + d1 ); System.out.println("ch = " + ch ); System.out.println("flag = " + flag ); // System.out.println("str = " + str ); //7 处理(如:显示) long x = b1 * 1L + s1 + i1 ; System.out.println( "x = " + x ); } catch (FileNotFoundException e) { System.out.println("文件找不到: " + e.getMessage() ); } catch (IOException e) { e.printStackTrace(); } finally { try { if( dos != null ) dos.close(); } catch (IOException e) { } try { dis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
以上是关于八种数据结构特点的主要内容,如果未能解决你的问题,请参考以下文章