算法其他篇

目录:

1.1 python中字典对象实现原理返回顶部

    注:字典类型是Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1)

  1、哈希表 (hash tables)

      1. 哈希表(也叫散列表),根据关键值对(Key-value)而直接进行访问的数据结构。

      2. 它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,更新也快。

      3. 而这个映射函数叫做哈希函数,存放值的数组叫做哈希表。

      4. 通过把每个对象的关键字k作为自变量,通过一个哈希函数h(k),将k映射到下标h(k)处,并将此对象存储在这个位置。

  2、具体操作过程

      1. 数据添加:把key通过哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,
                        将value存储在以该数字为下标的数组空间里。

      2. 数据查询:再次使用哈希函数将key转换为对应的数组下标,并定位到数组的位置获取value。

  3、{“name”:”zhangsan”,”age”:26} 字典如何存储的呢? 

      1. 比如字典{“name”:”zhangsan”,”age”:26},那么他们的字典key为name、age,假如哈希函数h(“name”) = 1、h(“age”)=3,

      2. 那么对应字典的key就会存储在列表对应下标的位置,[None, “zhangsan”, None, 26 ]

  4、解决hash冲突

      

1.2 顺序表返回顶部

  1、顺序表特点

      1. 线性表的逻辑顺序与物理顺序一致,数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。

      2. 对顺序表中的所有表项,即可以进行顺序的访问,也可以随机的访问,也就是说,
          既可以从表的第一个表项开始逐个访问表项也可以按照表项的序号(下标)直接的访问。

      3. 无需为表示结点间的逻辑关系而增加额外的存储空间,存储利用率提高。

      4. 可以方便的存储表中的任一结点,存储速度快。

      缺点:

        1)在表中插入新元素或删除无用元素时,为了保持其他元素的相对次序不变,平均需要移动一半元素,运行效率低
        2)由于顺序表要求占用连续的空间,如果预先进性存储分配,则当表长度变化较大时,难以确定合适的存储空间带大小
        3)若按可能达到的最大的长度预先分配表的空间,则容易造成一部分空间长期的限制而得不到充分的利用

  2、链表

      1. 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

      2. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

      3. 每个结点包括两个部分:数据域和指针域

      特点:

        1)可以方便的进行扩充。

        2)可以方便的删除和插入。

  3、顺序表的线性存储示意图   

      1. 假设线性表中有n个元素,每个元素占k个存储单元,第一个元素的地址为Loc(a1),则第i个元素的地址Loc(ai):

      2. Loc(ai) = Loc(a1) + (i-1) * k; # 其中Loc(a1)称为基地址。

        

  4、顺序表增删改查原理

# 1、顺序表的初始化
顺序表的初始化就是把顺序表 初始化为空的顺序表;只需把顺序表的长度length置为0即可;
# 2、求顺序表的长度
顺序表的长度就是就顺序表中的元素的个数,由于在插入和删除操作中都有对数据表的长度进行修改,所以求表长只需返回length的值即可;
# 3、按序号查找
查找顺序表中第i个元素的值(按序号查找),如果找到,将将该元素值赋给e。
查找第i个元素的值时,首先要判断查找的序号是否合法,如果合法,返回第i个元素对应的值。
# 4、插入元素
在数据表的第i个位置插入元素,在顺序表的第i个位置插入元素e
首先将顺序表第i个位置的元素依次向后移动一个位置,然后将元素e插入第i个位置,移动元素要从后往前移动元素,
即:先移动最后一个元素,在移动倒数第二个元素,依次类推;
插入元素之前要判断插入的位置是否合法,顺序表是否已满,在插入元素之后要将表长L->length++;
# 5、删除操作
删除表中的第i个元素e,删除数据表中的第i个元素,需要将表中第i个元素之后的元素依次向前移动一位,将前面的元素覆盖掉。
移动元素时要想将第i+1个元素移动到第i个位置,在将第i+2个元素移动i+1的位置,直到将最后一个元素移动到它的前一个位置。
进行删除操作之前要判断顺序表是否为空,删除元素之后,将表长L->length--;
# 6、按内容查找
查找数据元素e在表中的位置,可以从表头开始一直遍历表中元素。
如果找到与要查找元素e相等的元素,则返回元素在表中的位置,数组下标从0开始。
则元素在表中对应的位置序号值应为对应数组下标加1,没有找到则返回0。
# 7、头插
头插,即在表头插入元素e,在表头插入元素,需要将表中的元素依次后移一位,
然后将要插入的元素e赋给数字的首元素,执行插入操作后将表长L->length++;
需要注意的是移动元素要从顺序表的最后一个元素开始移动,
如果从第1个元素开始移动,会使得第1个元素的值覆盖第2个元素的值,然后把第二个元素后移则会使第2个元素的值
(原来第1个元素值)覆盖第3个元素的值,依次类推,最后出插入元素外,其余元素值均为原顺序表中第一个元素的值。
# 8、头删
删除顺序表中的第一个元素,只要将顺序表中的元素从第2个开始,依次向前移动1位,覆盖原来顺序表中元素对应位置的前一个值
在删除元素之前要判断顺序表是否为空,删除顺序表元素之后将顺序表长度L->length--;
# 9、尾插
在顺序表表尾插入元素e,L->data[L->length] = e;将元素e的值赋给顺序表中最后一个元素的下一个元素;
尾插操作,需要判断顺序表是否已满,尾插后将顺序表长度L->length++;
# 10、尾删
删除表尾元素,只需将顺序表的长度减1,类似于出栈操作,栈顶指针top –。
# 11、清空顺序表
清空顺序表就是将表中的元素删除。删除表中的元素只需将表的长度置为0。
# 12、判断表是否为空
如果顺序表的长度为0,则顺序表为空,返回1,否则,返回0;
# 13、打印表中元素
依次打印顺序表中的元素,如果顺序表为空则输出提示。

顺序表增删改查原理

1.3 python 列表(list)返回顶部

  1、python列表

      1. 在CPython中,列表被实现为长度可变的数组。

      2. 列表对象在 C 程序中的数据结构:有一个指针数组用来保存列表元素的指针,和一个可以在列表中放多少元素的标记。

      3. 内存的槽的个数并不是当前列表就有这么多的元素,列表元素的个数和 len(列表)是一样,就是真正的元素的个数。

      4. 但分配的槽的大小,会比元素个数大一点,目的就是为了防止在每次添加元素的时候都去调用分配内存的函数。

  2、C中数组存储方式

      1. 必须牢记:定义并初始化一个数组后,在内存里分配了两个空间,一个用于存放数组的引用变量,一个用于存放数组本身。

      2. 数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可通过该数组变量来访问数组元素。

      3. 如果我们希望在程序中访问数组,则只能通过这个数组的引用变量来访问它。

      4. 实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。

  3、python列表操作时间复杂度

      index() O(1)

      append O(1)

      pop() O(1)

      pop(i) O(n)

      insert(i,item) O(n)

      del operator O(n)

      reverse O(n)

      sort O(nlogn)

  4、列表和元组比较

      1. 列表是动态的,其大小可以改变(重新分配);
      2. 而元组是不可变的,一旦创建就不能修改。
      3. list和tuple在c实现上是很相似的,对于元素数量大的时候,都是一个数组指针,指针指向相应的对象,找不到tuple比list快的理由。
      4. 但对于小对象来说,tuple会有一个对象池,所以小的、重复的使用tuple还有益处的。

  5、tuple使用场景

      1. 实际情况中的确也有不少大小固定的列表结构,例如二维地理坐标等;

      2. 另外tuple也给元素天然地赋予了只读属性;

  6、列表与字典比较

      1. list是有序的,dict是无序的

      2. list通过索引访问,dict使用key访问

      3. list随着数量的正常增长要想查找元素的时间复杂度为O(n), dict不随数量而增长而变化,时间负责都为O(1)

  7、列表和字典应用场景

      1. list一般可作为队列、堆栈使用,而dict一般作为聚合统计或者快速使用特征访问等

      2. list 是记录简单有序数据的,就是一对一的那种,可以理解为一维数组.

      3. dict 是记录复杂无序数据,就是一对多,可以理解为多维数组.

06: 字典、顺序表、列表、hash树 实现原理的更多相关文章

  1. 哈希表(Hash Table)原理及其实现

    原理 介绍 哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映 ...

  2. redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表

    1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...

  3. 哈希表(Hash Table)/散列表(Key-Value)

    目录 1. 哈希表的基本思想 2. 哈希表的相关基本概念 1.概念: 2.哈希表和哈希函数的标准定义: 1)冲突: 2)安全避免冲突的条件: 3)冲突不可能完全避免 4)影响冲突的因素 3. 哈希表的 ...

  4. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

  5. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  6. java顺序表和树的实现

    一.顺序表 1.线性表 //java顺序表的实现,如ArrayList就是用线性表实现的,优点是查找快,缺点是添加或删除要移动很多元素,速度慢 public class SequenceList { ...

  7. Hash表(hash table ,又名散列表)

    直接进去主题好了. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...

  8. 为什么我要放弃javaScript数据结构与算法(第七章)—— 字典和散列表

    本章学习使用字典和散列表来存储唯一值(不重复的值)的数据结构. 集合.字典和散列表可以存储不重复的值.在集合中,我们感兴趣的是每个值本身,并把它作为主要元素.而字典和散列表中都是用 [键,值]的形式来 ...

  9. [Redis]Redis的设计与实现-链表/字典/跳跃表

    redis的设计与实现:1.假如有一个用户关系模块,要实现一个共同关注功能,计算出两个用户关注了哪些相同的用户,本质上是计算两个用户关注集合的交集,如果使用关系数据库,需要对两个数据表执行join操作 ...

随机推荐

  1. 搭建redsocks 测试环境

    1. 先来谈谈pc的测试环境 socks5代理,因为要在centos下设置,没有yum到socks, 就安装ss5,wget http://jaist.dl.sourceforge.net/proje ...

  2. SignalR WebSocket Error during WebSocket handshake: net::ERR_CONNECTION_RESET

    system.web 节点添加: <httpRuntime maxRequestLength="104857600" executionTimeout="1200& ...

  3. Deeplab v3+的结构代码简要分析

    添加了解码模块来重构精确的图像物体边界.对比如图 deeplab v3+采用了与deeplab v3类似的多尺度带洞卷积结构ASPP,然后通过上采样,以及与不同卷积层相拼接,最终经过卷积以及上采样得到 ...

  4. serlvet中的过滤器filter

    1.概念 过滤作用,对从客户端向服务器端发送的请求进行过滤,也可以对服务器端返回的响应进行处理.它使用户可以改变一个request和修改一个 response..Filter 不是一个servlet, ...

  5. 海量交通大数据应用平台MTDAP_nchang的经验记录

    WRONGTYPE Operation against a key holding the wrong kind of value 根本的就是redis同一个key的value值前后类型不一致,比如最 ...

  6. 000-js判断电脑或手机登录

    <script type="text/javascript"> try{ if(/Android|webOS|iPhone|iPod|BlackBerry/i.test ...

  7. oracle中实现md5加密

    记得要实现md5加密,在oracle 11g 和 12c中是有不同的方式的,在12c中较为简单,记得直接有预定义的函数. 但是在11g中要实现就需要自己进行一些额外的处理,以下给出一个md5函数的实现 ...

  8. 软工网络15团队作业4——Alpha阶段敏捷冲刺4.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺4.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  9. canvas添加水印

    <canvas id="canvas"></canvas><canvas id="water"></canvas> ...

  10. TMC首秀:写作带给我生命的影响与感动

    蓦然回首,写作已陪伴了我十三个年头,横跨大学.读研.工作之初.直到现在.我将分四个小乐章,分享写作给我的生命带来的影响和感动. 第一乐章:治疗与励志 说起写作的缘由,虽然可以追溯到初高中时读过的一点文 ...