算法系列0.2——哈希表和有序表

哈希表如UnOrderedSet/HashSet在C++和Java中实现快速增删查改,时间复杂度近似O(1),而有序表如SortedSet/TreeSet基于红黑树,支持排序及范围查询,操作通常为O(logN)。Java中的String被视为基础类型,而自定义类型需提供比较器。
摘要由CSDN通过智能技术生成

哈希表和有序表

  • 哈希表

    • 在c++中叫做UnOrderedSet(UnSortedMap),UnOrderedMap(UnSortedMap)
    • 在java中叫做HashSet,HashMap
    • set只有key,map是一个key带一个value,内部没有什么区别
    • add(set)完成加,put(map)完成加入更新,remove删除,get查,containsKey查
    • 可以认为增删查改都在O(1)完成,但常数项比较大,比数组大很多
    • (key)基础类型在哈希表内部按值传递
    • (key)不是基础类型在哈希表内按引用传递,占用一律8字节(内存地址),占用空间少了,只要内存地址不同,就可以认为key不一样
      • java中的string属于基础类型
  • 有序表

    • 在c++中叫做SortedSet(OrderedSet),SortedMap(OrderedMap)

    • 在Java中叫做TreeSet,TreeMap

    • 内部根据key来组织,而且整体有序(key要求一定可以比较)

    • 可以像哈希表一样实现增删查改

    • 此外可以找出最小firstKey,最大lastKey,floorKey(小于等于最大),cellingKey(大于等于最小)

    • 性能上比哈希表差一点,所有的操作是O(logN)

    • 具体实现是红黑树,AVL树,size-balance-tree和跳表

    • (key)放入哈希表如果不是基础类型,必须提供比较器,按引用传递,通过比较器确定两者的先后关系

TreeSet<Node> treeSet = new TreeSet<>(new NodeComparator()); //红黑树

c++中新的重复的键会被忽略,Java中新的重复的键会覆盖旧的键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值