zoukankan      html  css  js  c++  java
  • 哈希中的那些序问题

    几乎所有语言都会内置哈希表这一数据结构,其实就是一个哈希函数,配合数组和链表实现,会存在数组的重新动态分配的过程。[reference]

    哈希表一般会被实现成两种形式,即所谓的Map和Set,基本上可以认为Set是只利用了Key值信息的Map,例如Java的HashSet就是基于HashMap实现的。

    提到哈希表可能会有一些比较绕的序问题,各个语言还都有自己的特色。

    先区分一下有序、无序以及排序:有序、无序是指插入元素时,保持插入的顺序性,也就是先插入的元素优先放入集合的前面部分(view it or iterate through it)。 而排序是指插入元素后,集合中的元素是否自动排序。(例如升序排序)。

    1、先说Python:

    在py 3.6以前,dict是无序的,想要有序的dict可以from collections import OrderedDict(内部维护了一个双向链表)。

    但是在3.6(含)及以后的版本中,From Python 3.6 onwards, the standard dict type maintains insertion order by default。

    依旧有一些理由来使用OrderedDict:

    那么dict有序是怎么实现的呢,参考 stackoverflow

     Python中似乎没有所谓自动排序的集合,这种集合底层都是基于树来实现的。

    在py 3.6以前,dict的无序性质保证了不能依赖dict的顺序,尽管遍历输出时它也遵循某种顺序,但这个顺序是不可靠的,至少有两个因素会影响到:新插入的元素;散列表扩容。

    2、Java就很简单了:

    HashMap、HashSet之类的都是无序的。

    加了Linked之后都是有序的,如LinkedHashMap。

    以Tree打头的,如TreeMap,TreeSet都是排序的。

    3、C++就比较原始了:

    毕竟从C++ 11才开始引入unordered_map。

    原来的STL中的map是基于红黑树实现的,所以会有排序性质,查找的复杂度是O(log N)。

    unordered_map自然是基于散列表来实现的,无序。

    至于有序这回事(即维护元素插入顺序),C++貌似还没考虑到。hhh

  • 相关阅读:
    spring mvc+ELK从头开始搭建日志平台
    java分布式系统开关功能设计(服务升降级)
    可伸缩性架构常用技术
    大众点评订单系统分库分表实践
    分布式缓存--系列1 -- Hash环/一致性Hash原理
    Netty原理剖析
    一个轻量级分布式 RPC 框架 — NettyRpc
    HDU 2583 permutation
    HDU 2573 Typing
    c语言中逗号运算符和逗号表达式
  • 原文地址:https://www.cnblogs.com/niuxichuan/p/11608386.html
Copyright © 2011-2022 走看看