算法学习笔记——底层数据结构:哈希表、列表、集合

散列表/哈希表Hash Table

数组中保存着许多数据['apple','banana',...'milk',...'lemon']如果希望找到'milk'的位置(下标index),有以下几种查找方式

  • 简单查找:O(n),对于字符串,相当于数据都是无序的,需要一个一个对比,看当前的数据是否是目标数据
  • 二分查找:O(log2n),数据有序排列,每次将数据分为两半,提高查找效率
  • 散列表:O(1),对于要查找的数据,用散列函数直接映射为一个独一无二的数字,这个数字就是目标数据的存储位置(下标index),这样可以直接取出数据
    散列函数必须满足:①有相同输入,一定有相同输出②不同的输入映射到独一无二的数字上
    平均情况下,散列表的查找(获取特定元素的值)和数组一样快,查找性能优于链表;而插入和删除与链表的速度一样快,性能优于数组;因此,散列表兼具数组和链表的优点

Pyhton中散列表的实现

大多语言都提供了散列表实现,Python的散列表实现就是字典dict
对于散列表,检查一个元素是否存在、访问一个元素,速度非常快

算法不能脱离数据结构,各种算法本质上都是将基本的数据结构进行组合,把握好链表、二叉树等基本的数据结构的特性,进而构建上层算法

Python中的内置数据结构

列表list

理解为数组
访问复杂度O(1),在尾部append复杂度O(1)
判断元素x in list需要逐项对比,复杂度O(n)
缺点:在中间部分插入和删除的复杂度O(n)

字典dict

理解为Python中的哈希表HashMap实现
访问、删除复杂度O(1)
判断元素x in dict复杂度O(1)
缺点:元素无序

注意,从Python 3.6开始,普通字典dict也保证插入顺序不变
dict可直接实现有序字典OrderedDict的功能;
若只关注key而忽略value,dict可直接实现有序集的功能

集合set

理解为Python中的哈希集合HashSet实现,底层实现基于哈希表dict
访问、删除复杂度O(1)
判断元素x in dict复杂度O(1)
缺点:元素无序

参考:【python】list,dict,set的时间复杂度

你可能感兴趣的:(算法学习笔记,数据结构,哈希算法)