MicroPython核心:映射和字典

news2024/10/6 6:40:25

MicroPython字典和映射使用称为开放寻址和线性探测的技术,本文详细介绍了这两种方法。

开放寻址

开放寻址用于解决碰撞问题,碰撞是非常常见的现象,当两个条目恰好散列到同一个槽或位置时就会发生碰撞。例如,散列设置如下:

开放寻址

如果有一个请求要将70填入0号槽位,由于0号槽位不是空的,因此开放寻址会在字典中查找下一个可用的槽位来满足该请求。这种顺序搜索备用位置的方法称为探测。有几种顺序探测算法,但 MicroPython 使用的是线性探测。

线性探测

线性探测是在字典中查找可用地址或槽位的方法之一,在MicroPython中,它与开放寻址一起使用。在处理上述请求时,与其他探测算法不同的是,线性探测假定两次探测之间的间隔固定为1,因此,该请求通过将条目放入下一个空闲的槽位(在示例中是插槽位4)来实现:

线性探测

同样的方法,即开放寻址和线性探测,也可用于搜索字典中的条目。假设要搜索数据项33。计算出的哈希值将是2。在槽位2中可以找到33,此时返回True。搜索70则完全不同,因为在插入时发生了碰撞。因此,计算出的哈希值为0,当前为44,这里不会简单地返回False,而是从位置1开始执行顺序搜索,直到找到条目70或遇到空闲的插槽,这就是在哈希值中执行查找的一般方法:

// 仍然没有找到, 继续在表中查找
pos = (pos + 1) % set->alloc;

if (pos == start_pos) {
    // 查找返回到起始位置,说明索引没有在表中
    if (lookup_kind & MP_MAP_LOOKUP_ADD_IF_NOT_FOUND) {
        if (avail_slot != NULL) {
            //找到一个可用的插槽,就用它了
            set->used++;
            *avail_slot = index;
            return index;
        } else {
            //在表中没有足够的空间,重新哈希
            mp_set_rehash(set);
            //重新开始查找新的元素
            start_pos = pos = hash % set->alloc;
        }
    }
} else {
     return MP_OBJ_NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】极简Docker搭建“帕鲁幻兽PalWorld”服务器, 附资源

注意: 如果搭建在个人服务器或者内网中,需要做内网穿透,可以看这篇博客: 【教程】超详细安装和使用免费内网穿透软件Zerotier-One-CSDN博客文章浏览阅读523次,点赞8次,收藏8次。真的很详细https://blog.csd…

14个国产AI大模型备案获批,众多科技巨头进入AIGC赛道

北京商报官网消息,第四范式、什么值得买、新壹科技、衔远科技、小米、智联招聘、Boss直聘、脉脉等13家企业的,14个国产AI大模型通过《生成式人工智能服务管理暂行办法》备案,可实现商业化应用。 自2023年8月,文心一言、讯飞星火、…

在Windows中如何格式化硬盘?这里提供了详细的步骤

格式化硬盘意味着擦除硬盘上的任何信息和设置文件系统,以便操作系统可以从硬盘读取数据并将数据写入硬盘。如果你计划在Windows中使用硬盘,则需要格式化硬盘。 如何在Windows中格式化硬盘 按照以下简单步骤在Windows 11,Windows 10,Windows 8,Windows 7,Windows Vista或…

【机器学习前置知识】隐变量

隐变量又称潜变量,顾名思义就是隐藏着的随机变量,它不能通过观测来得到,或者说它产生的过程是不可观测的,然而它却可以在潜移默化中影响可观测变量。 我们用抛硬币为例来解释什么是隐变量。假设有 A 、 B 、 C A、B、C A、B、C …

jrt运维命令改造

以前发布网站都是定死网站放置路径的,现在JRT想面向更广范围推广,所以就不能明确确定网站放置目录,为此需要改造一下jrt命令和sh来满足目录不确定情况和多个程序用不同管理命令的要求。 以前是写死的,现在改为调程序运行目录的sh…

Redhat 8.4 一键安装 Oracle 11GR2 单机版

Oracle 一键安装脚本,演示 Redhat 8.4 一键安装 Oracle 11GR2 单机版过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址:Shell脚本安装Oracle数据库 脚本…

利用OpenCV检测物流过程中的暴力拆箱和暴力拿放行为

背景介绍: 随着电子商务的快速发展,物流行业面临着越来越多的挑战。其中,暴力拆箱和暴力拿放成为最突出的问题之一。这些行为不仅会导致货物损坏,还会给物流公司和消费者带来巨大的经济损失。传统的解决方法依赖于人工监控&#x…

git仓库批量备份

git的mirror参数 在git中&#xff0c;--mirror是一个用于克隆和推送操作的参数。它用于创建一个镜像仓库&#xff0c;包含了源仓库的所有分支、标签和提交历史记录。 当使用git clone --mirror <source-repo>命令时&#xff0c;会创建一个完全相同的镜像仓库&#xff0…

P1012 [NOIP1998 提高组] 拼数题解

题目 设有n个正整数,将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。 输入输出格式 输入格式 第一行有一个整数&#xff0c;表示数字个数n。 第二行有n个整数&#xff0c;表示给出的n个整数。 输出格式 一个正整数&#xff0c;表示最大的…

导出Mysql数据库表名和字段并合并成一个word

参考链接&#xff1a; 导出MySQL数据库所有库和字段注释及相关信息为word文档——工具类 java - Apache POI - How to copy tables from one docx to another docx - Stack Overflow 领导让我研究下一个低代码平台的代码&#xff0c;我就想着做一个把数据库字段直接导出来的…

【算法专题】贪心算法

贪心算法 贪心算法介绍1. 柠檬水找零2. 将数组和减半的最少操作次数3. 最大数4. 摆动序列(贪心思路)5. 最长递增子序列(贪心算法)6. 递增的三元子序列7. 最长连续递增序列8. 买卖股票的最佳时机9. 买卖股票的最佳时机Ⅱ(贪心算法)10. K 次取反后最大化的数组和11. 按身高排序12…

关于Spring Boot和MyBatis常见的十道面试题

拦截器和过滤器有什么区别&#xff1f; 拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;都是用于在请求道道目标资源的之前或之后进行处理的组件。主要区别有以下几点&#xff1a; 依赖对象不同&#xff1a;过滤器是来时Servlet&#xff0…

蓝桥杯2024/1/28----十二届省赛题笔记

题目要求&#xff1a; 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 &#xff1a; 选手需严格按照以上要求配置竞赛板&#xff0c;编写和调…

【JS逆向实战-入门篇】某gov网站加密参数分析与Python算法还原

文章目录 1. 写在前面2. 请求分析3. 断点分析4. 算法还原 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

Unity 观察者模式(实例详解)

文章目录 简介示例1 - 简单的文本更新通知示例2 - 多观察者监听游戏分数变化示例3 - 事件系统实现观察者模式示例4 - 泛型观察者和可序列化的事件系统示例5 - 使用C#委托简化版 简介 在Unity中实现观察者模式&#xff0c;我们可以创建一个Subject&#xff08;目标/主题&#x…

【Vue.js设计与实现】第一篇:框架设计概览-阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 参考&#xff1a;速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.…

代码随想录算法训练营29期|day34 任务以及具体任务

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序&#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.ab…

c++学习记录 文件操作—文本文件—读文件

#include<iostream> using namespace std; #include<fstream> #include<string>void test01() {//创建流对象ifstream ifs;//打开文件&#xff0c;并且判断是否打开成功ifs.open("test.txt", ios::in);if (!ifs.is_open()){cout << "文…

39种值得关注的利基AI应用【2024】

人工智能非常令人兴奋。 潜在的应用数量如此巨大&#xff0c;而且这个空间正在以光速发展。 由于步伐轻快&#xff0c;听到该技术正在堵塞所有不同的漏洞就像开车穿过乡村小镇向窗外看一样。 你捕捉到了大部分重要的东西&#xff0c;但许多独特的魅力和隐藏的宝石却被忽视了。…

GM/T 0018-2012 设备接口描述笔记

GM/T 0018-2012 设备接口描述笔记 文章目录 GM/T 0018-2012 设备接口描述笔记6. 设备接口描述6.1 密码设备应用接口在公钥密码基础设施应用技术体系框架中的位置6.2 设备管理类函数6.3 密钥管理类函数6.4 非对称算法运算类函数6.5 对称算法运算类函数6.6 杂凑运算类函数6.7 用户…