`
blueyanghualong
  • 浏览: 227337 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

最基础的数据结构(转自程序员杂志)(选二)

阅读更多
 Hash表
   作为一种抽象数据结构,词典(Dictionary)被定义为键-值(Key-Value)对的集合。举例来说,在电话号码簿中,通过查找姓名,来找到电话号码,这个例子中姓名是key,电话号码是value。又比如,在学生花名册中,通过查找学号,来找到学生的姓名,这个例子中学号是key,学生的姓名是value。词典最常见的实现方式是Hash表。
   Hash表的实现思路如下:通过某种算法,在键-值对的存储地址和键-值对中的key之间,建立一种映射,使得每一个key,都有一个确定的存储地址与之对应。这种算法被封装在Hash函数中。在查找时,通过Hash函数,算出和key对应的存储地址,从而找到相应的键-值对。相对于通过遍历整个键-值对列表来进行查找,Hash表的查找效率要高得多,理想的情况下算法复杂度仅为O(1)(遍历查找的复杂度为O(n))。
  但是,由于通常情况下key的集合比键-值对存储地址的集合要大得多,所以有可能把不同的key映射到同一个存储地址上。这种情况称为冲突(collision)。一个好的Hash函数应该尽可能地把key映射到均匀的地址空间中,以减少冲突。Hash表的实现也应该提供解决冲突的方案。
  Hash表是一种相对复杂得多的数据结构,从底层完整地实现一个Hash表,也许超出了对一个普通程序员的要求。但是,由于它是如此重要,了解Hash表的概念和掌握使用它的接口,仍然是一项必不可少的技能。
   C语言中没有提供现成的Hash表,但是C++提供了优秀的Hash表实现容器hash_map。象STL中的其他容器一样,hash_map支持任何数据类型,支持内存自动管理,能够自动增长。特别地,hash_map通过模板机制,实现了和hash函数的剥离,也就是说,程序员可以定义自己的hash函数,交给hash_map去进行相应的工作。如下例:
  
  hash_map <string, int> hml; // 使用默认的Hash<string>函数
  hash_map <string, int, hfct> hml; // 使用自定义的hfct()作为hash函数
  hash_map <string, int, hfct, eql> hml; // 使用自定义的hfct()作为hash函数,并且使用自定义的eql()函数比较对象是否相等
  
   Java定义了Map接口,抽象了关于Map的各种操作。在实现了Map接口的类中,有两种是Hash表:HashMap和WeakHashMap(HashTable在Java 1.1以后已被废弃)。后者用于实现所谓“标准映射”(canonicalizing mappings),和本文讨论的内容关系不大。HashMap接受任何类型的对象作为键-值对的元素,支持快速的查找。如下例:
  
  HashMap hm = new HashMap();
  hm.put("akey", "this is a word"); // 使用两个字符串作为键-值对
  String str = (String) hm.get("akey");
  System.out.println(str);
  
  HashMap和hash函数也是剥离的,但使用了另一种思路。在Java中,根类型Object定义了hashCode()和equals()方法,由于任何类型的对象都派生自Object,所以它们都自动继承了这两个方法。用户自定义的类应该重载这两个方法,以实现自己的hash函数和比较函数。如果这两个函数没有被重载,Java会使用Object的hashCode()和equals()方法,它们的默认实现分别是返回对象的地址,以及比较两个对象的地址是否相等。
  在PHP中,数组和Hash表合而为一了。从语法上看,PHP中并没有Hash表这样的容器,而只支持数组。不同的是,PHP中的数组不但支持使用数字下标进行索引,而且支持使用字符串下标进行索引。换句话说,PHP中的数组支持使用键-值对作为数组的元素,并且可以使用键来进行索引(键必须为integer类型或string类型)。而且,PHP中的数组支持自动增长和嵌套。如下例:
  
  $arr = array(1 => 12, "akey" => "this is a word");
  echo $arr[1]; // 得到12
  echo $arr["akey"]; // 得到"this is a word"
  
   PHP没有提供自定义hash函数的接口。由于它不接受integer和string以外的类型作为键,这一点事实上也没有必要。
  
  结束语
   当接受这篇文章的约稿时,我认为这是一项比较简单的工作。因为这三种数据结构实在是太基础了,所以我甚至怀疑是否能够写出足够长的篇幅。很快我就发现了自己的错误。光是字符串就够写一本书的。
   在撰写本文的过程,我回顾了学习过的大部分编程语言,重温了许多经典书籍中的相关章节,启动了各种IDE编写测试用例。我接触到了大量未知的领域,至今我仍然在猜测许多问题的实现细节。这从另外一个方面说明了基本数据结构的重要性:即使在我们最熟悉的事物中,也隐藏着极为深刻的原理
分享到:
评论

相关推荐

    数据结构基础,专业程序员基础

    数据结构是计算机科学中的核心概念,对于任何专业的程序员来说,它是构建高效算法和解决复杂问题的基础。本课程“数据结构基础”旨在为学习者提供必要的数据结构知识,以提升编程能力,更好地理解和设计复杂的程序...

    数据结构_程序员考试

    数据结构是计算机科学中的核心概念,对于任何程序员来说,理解和掌握数据结构都是至关重要的。它涉及到如何有效地组织和管理大量数据,以便进行高效的操作。在程序员考试中,数据结构的知识通常会占据相当大的比重,...

    程序员数据结构笔记

    1. **数据结构的基本概念**:数据结构指的是数据的组织方式,它定义了数据之间的关系以及操作这些数据的方法。在学习数据结构时,我们需要理解对象的定义,如何在内存中表示数据,以及实现各种操作的逻辑。 2. **...

    程序员杂志08012(2)

    程序员杂志08012(2) 程序员杂志08012(2)

    程序员代码面试指南 IT名企算法与数据结构题目最优解.zip

    这本书主要聚焦于算法和数据结构,旨在帮助读者掌握在面试中常见的问题,并提供最优解。"左神"作为标签,暗示了这本书的作者或者内容在编程界具有较高的权威性和影响力,"左神"通常是对在编程领域有深厚造诣的人的一...

    程序员杂志08012

    程序员杂志08012(1) 程序员杂志08012(1)

    Java版数据结构(程序员必须看)

    《Java版数据结构》是一本针对程序员深入理解数据结构的经典读物。数据结构作为计算机科学的基础,对于编写高效、优化的程序至关重要。本书旨在探讨如何在Java编程环境中有效地组织和管理数据,以提升程序的性能和可...

    程序员代码面试指南:IT名企算法与数据结构题目最优解-代码

    《程序员代码面试指南:IT名企算法与数据结构题目最优解-代码》是一部专为准备IT企业面试的程序员量身定制的指南。本书的核心内容围绕算法和数据结构展开,通过Java语言实现,旨在帮助读者掌握解决常见面试问题的...

    程序员杂志

    《程序员杂志》是一本专注于IT行业的专业出版物,旨在为软件开发者、技术爱好者以及IT从业人员提供最新的技术资讯、深度分析和实践经验。这本杂志涵盖了编程语言、软件工程、系统架构、移动开发、人工智能、大数据、...

    最常用的数据结构与算法 程序员必备

    数据结构与算法是计算机科学的基础,对于任何程序员来说,它们都是不可或缺的知识点。掌握这些基础知识不仅可以提高编程效率,还能帮助解决复杂问题,设计出更高效、更优化的解决方案。 一、数据结构 数据结构是...

    数据结构程序员考试题目

    1.1数据结构讨论的范畴 Niklaus Wirth Algorithm + Data Structures = Programs 程序设计: 为计算机处理问题编制一组指令集 算法:处理问题的策略 数据结构:问题的数学模型 例如: 数值计算的程序设计问题 结构静力...

    程序员电子杂志2009高清版

    同时,数据库技术、网络编程、算法与数据结构等基础领域的深度解析也是其特色之一,帮助读者巩固理论基础,提高编程效率。 此外,2009年是Web2.0概念深入人心的一年,杂志可能详细解读了AJAX、JavaScript框架(如...

    程序员数据结构笔记 知识 能力 过程

    数据结构是计算机科学中至关重要的基础概念,它关乎如何有效地组织和管理数据,以便进行高效的操作。本笔记主要关注程序员需要掌握的数据结构知识、能力以及解决问题的过程。 首先,数据结构中对象的定义是指数据的...

    数据结构 程序员考试

    1. **数组**:是最基础的数据结构,它是一个元素类型相同的有序集合,可以通过索引快速访问任何位置的元素。数组的插入和删除操作通常比较低效,因为可能需要移动大量元素。 2. **链表**:链表中的元素不按线性顺序...

    《程序员》杂志

    《程序员》杂志是一本专注于IT行业的专业出版物,旨在为程序员和相关技术从业者提供最新的编程技术和行业动态。这本杂志的2012年第8期很可能涵盖了当年热门的编程语言、开发工具、软件工程实践以及新兴技术趋势。...

    程序员面试题精选100题【数据结构 /算法】

    【程序员面试题精选100题【数据结构 /算法】】是针对求职程序员精心挑选的一系列面试题目,涵盖了数据结构和算法两大核心领域。这些题目旨在帮助应聘者提高面试技巧,提升对技术的理解,以便在激烈的就业市场竞争中...

    2009年程序员杂志第一期

    《2009年程序员杂志第一期》是程序员们获取技术资讯、行业动态以及深度文章的重要参考资料。这一期杂志包含了2009年初IT行业的前沿趋势、编程技术、软件工程实践以及开发者关注的热点问题。作为一本专业杂志,它不仅...

    2009年程序员杂志第二期

    2009年程序员杂志第二期(希望大家有收获)

    C#数据结构(C#程序员必备)

    - **第一章**:介绍数据结构和算法的基本概念,包括必要的数学知识和C#语言基础。 - **第二章至第六章**:分别讲解线性表、栈和队列、串和数组、树型结构和图结构等核心数据结构,并探讨它们在.NET框架中的实现。 - ...

Global site tag (gtag.js) - Google Analytics