哈希表

python 内存管理

安稳与你 提交于 2019-12-05 05:03:59
python的内存管理 计数器 垃圾回收机制 垃圾回收:引用计数为主,标记清除和分带回收为辅 开启一个新的对象会存放到双端链表中 通过引用计数来决定是不是垃圾,但是会有循环引用的问题 为了解决循环引用,使用了标记清除,标记清除就是将循环引用的内容引用计数自动减一 为了解决多次扫描一个双端链表,使用了分袋回收,一共3个袋,0袋,1袋,2袋 当0袋的总长度>=700时扫描一下0袋,当0袋扫描10次后扫描一次1袋,扫描10次后计数仍大于等于1的进入1袋 当1袋扫描10次后扫描一次2袋,1袋扫描10次后计数仍大于等于1的进入2袋 内存池 a = 3.14 del a print(id(a)) b = 2.7 print(id(b)) #a和b的内存地址一样,因为有内存池的存在,浮点数和列表会使用和之前创建的对象同一内存地址 如何避免哈希冲突 可哈希? 如果一个对象在其生命周期内,其哈希值(可以通过python的内置函数hash获得)从未改变(这需要一个__hash__()方法),并且可以与其他对象进行比较(这需要一个__eq__()或__cmp__()方法),那么这个对象就是可哈希的。哈希对象的相等意味着其哈希值的相等。 哈希性使得对象可以用作dictionary键和set成员,因为这些数据结构在内部使用了哈希值。 Python的所有不可变的内置对象都是可hashable的,但可变容器

Mysql索引

两盒软妹~` 提交于 2019-12-05 05:01:53
前言 就我个人所知,MySQL目前已经作为绝大数项目的数据库选择。但是经常会需要去处理慢sql导致的各类问题。索引,作为一种常见的处理方式。我们有必要了解下索引的底层是怎么实现的。 思考两个问题: 1.为什么加了索引以后,数据库的查询效率会加快?底层怎么实现的? 2.索引失效的情况有哪些?失效的原因是什么? 简洁描述 索引是快速查找特定列值的行数据的,一种优化查询的数据结构。查找特定列值。例如一条sql里的查询条件是姓名 name = '张三' 。就能查出特定列(姓名列)的特定值(张三)的记录。 另外,它是一种数据结构。那么mysql的数据结构,采用的是B+树。那么,为啥选B+树而不是其他的数据结构。 从数据结构看原理 此处主要讨论下哈希表,平衡二叉树,B树,B+树这4种数据结构,以及为啥选用B+树作为mysql数据库的数据结构。首先看下这四种数据结构示例图。 哈希表 平衡二叉树 B树 B+树 哈希表 :哈希表的存储方式是通过计算出一个hash码,然后随机存放到哈希表中。注意:这时候存放的位置,生成的hash值也是无序的。 因此如果采用哈希表的话,根据某个值定向查询速度很快,也就是‘’=‘’的情况。可根据hash值直接找到对应值。但因为hash码是无序的,存储的书序也是无序的,因此hash表数据结构无法完成范围查询,比如>,<,like这些情况。显然是不满足条件的。 平衡二叉树

搜索引擎1

时间秒杀一切 提交于 2019-12-05 02:20:36
lucene 和 es 的前世今生 lucene 是最先进、功能最强大的搜索库。如果直接基于 lucene 开发,非常复杂,即便写一些简单的功能,也要写大量的 Java 代码,需要深入理解原理。 elasticsearch 基于 lucene ,隐藏了 lucene 的复杂性,提供了简单易用的 restful api / Java api 接口(另外还有其他语言的 api 接口)。 · 分布式的文档存储引擎 · 分布式的搜索引擎和分析引擎 · 分布式,支持 PB 级数据 es 的核心概念 Near Realtime 近实时,有两层意思: · 从写入数据到数据可以被搜索到有一个小延迟(大概是 1s ) · 基于 es 执行搜索和分析可以达到秒级 Cluster 集群 集群包含多个节点,每个节点属于哪个集群都是通过一个配置来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。 Node 节点 Node 是集群中的一个节点,节点也有一个名称,默认是随机分配的。默认节点会去加入一个名称为 elasticsearch 的集群。如果直接启动一堆节点,那么它们会自动组成一个 elasticsearch 集群,当然一个节点也可以组成 elasticsearch 集群。 Document & field 文档是 es 中最小的数据单元,一个 document 可以是一条客户数据

Sword 哈希表

守給你的承諾、 提交于 2019-12-05 00:38:06
哈希表 哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入、索引、删除的时间复杂度都是O(1)。这样优秀的时间复杂度是通过将元素的key值以hash方法f映射到哈希表中的某一个位置来访问记录来实现的,即键值为key的元素必定存储在哈希表中的f(key)的位置。当然,不同的元素的hash值可能相同,这就是hash冲突,有两种解决方法(分离链表发和开放地址发),ngx采用的是开放地址法. 分离链表法是通过将冲突的元素链接在一个哈希表外的一个链表中,这样,找到hash表中的位置后,就可以通过遍历这个单链表来找到这个元素 开放地址法是插入的时候发现自己的位置f(key)已经被占了,就向后遍历,查看f(key)+1的位置是否被占用,如果没被占用,就占用它,否则继续相后,查询的时候,同样也如果f(key)不是需要的值,也依次向后遍历,一直找到需要的元素。 哈希表的本质 普通哈希表的查找比较简单,思想就是先根据hash值找到对应桶,然后遍历这个桶的每一个元素,逐字匹配是否关键字完全相同,完全相同则找到,否则继续,直至找到这个桶的结尾(value = NULL)。 nginx的hash表是固定元素长度的,就是一开始已知所有的键值对。无法动态添加,但是可以修改值 gtc_hash_t * gtc_internal_hash_build(unsigned int max

前端与算法 leetcode 242. 有效的字母异位词

我与影子孤独终老i 提交于 2019-12-04 19:50:27
目录 # 前端与算法 leetcode 242. 有效的字母异位词 题目描述 概要 提示 解析 解法一:哈希表 解法二:数组判断字符出现次数 解法三:转换字符串 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 242. 有效的字母异位词 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? 242. 有效的字母异位词 概要 判断异位词的方法很多,可以用哈希表,也可以构建26个字符数组判断,还可以根据每个字符出现的次数排序后判断字符串是否相等 提示 哈希,数组 解析 解法一:哈希表 哈希表在本题中表现一般,但看到这题时往往第一时间就能想到这个办法.构建一个HashMap然后统计s中每个单词出现的次数,随后用这个表去判断第t中所有字符出现的次数,一旦字符出现的次数不相等或者没有这个字符就返回false 解法二:数组判断字符出现次数 构建一个长度为26的数组然后全部填充0,随后s中的 s[i]

哈希表相关题目-python

半城伤御伤魂 提交于 2019-12-04 18:58:34
栈&队列&哈希表&堆-python https://blog.csdn.net/qq_19446965/article/details/102982047 1、O(1)时间插入、删除和获取随机元素 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。 insert(val): 当元素 val 不存在时,向集合中插入该项。 remove(val): 元素 val 存在时,从集合中移除该项。 getRandom :随机返回现有集合中的一项。每个元素应该有相同的概率被返回。 示例 : // 初始化一个空的集合。 RandomizedSet randomSet = new RandomizedSet(); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。 randomSet.insert(1); // 返回 false ,表示集合中不存在 2 。 randomSet.remove(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。 randomSet.insert(2); // getRandom 应随机返回 1 或 2 。 randomSet.getRandom(); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。 randomSet.remove(1); // 2 已在集合中,所以返回 false

哈希查找对比普通遍历查找所需时间

别说谁变了你拦得住时间么 提交于 2019-12-04 18:13:00
  今天接触到了哈希算法。处于好奇心,我写了一段python代码来对比这两种查找方式在进行随机大规模查找时的效率差异。    import time import random a=[12,234,345,67,7,88,834,4353,56,324,123,567,53,45,234,123,123] hashList={} #哈希表 def r(): #生成一个随机被查找值,用来模拟随机查找 r=random.randint(0,16) n=a[r] return n def find(num): #普通遍历查找 for l in a: if(num==l): continue def getHash(): #生成哈希表 for l in a: key=(l*5+3)^2 hashList[key]=l def hashfind(num): #哈希查找 key=(num*5+3)^2 return normalTime=0 hashTime=0 t1=time.time() #计算生成哈希表需要时间 T2-T1 getHash() t2=time.time() for l in range(2000000): #进行二百万次模拟 n=r() start=time.time() find(n) end=time.time() nt=end-start normalTime

leetcode-1-Two Sum

柔情痞子 提交于 2019-12-04 17:35:01
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. 方法一:暴力法 方法二:哈希表 如题目所示,第一个元素是2,则查看哈希表是否有target-2的元素,如果没有则向后遍历,并将第一个元素(2,index)存入哈希表,遍历至7时,查看哈希表(target-7)=2的元素存在,即可以返回map(2)和当前元素所在的下标 代码: class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i = 0;i<nums

【译】实现一个世界上最快的int-int map

我的梦境 提交于 2019-12-04 16:45:10
最近看了很多 Map 实现的源码,循迹着一篇比较各类实现性能比较的综述,发现这篇文章,正好切合我的要求。趁着作者给的测评程序跑着(然而已经跑了一个小时了(○´・д・)ノ),搜索了一下发现没有人把这么好的文章翻译一下,可能内容比较基础,但是这种追求卓越的精神感染到了我,让我想起来以前读CSAPP时的感觉,于是决定翻译一下。同时,作者 Mikhail Vorontsov 其他的文章也非常好,有很多 Java 调优技巧和介绍 Java 性能的内容。 原文地址: http://java-performance.info/implementing-world-fastest-java-int-to-int-hash-map/ 最快的 int-to-int map 实现测评请看 我之前的文章 。 我要感谢 Sebastiano Vigna 和 Roman Leventov 和我分享了实现哈希表的智慧。一些实现的想法也来自于 Kris Kaspersky 的 “Code Optimization: Effective Memory Usage”。 这篇文章将一步步带你领略各式各样的现代哈希表实现。在文章的最后,你将获得一个可能是撰写本文时最快的 Java int-to-int 哈希表。 开放地址法 大多数现代哈希表都是基于开放地址法。这意味着什么?你的哈希表将基于 keys 数组( values

JAVA数据结构

强颜欢笑 提交于 2019-12-04 13:27:46
JAVA中的常用的数据结构、每个特定类的使用和功能适用的场合。 一、数据结构 1.逻辑结构和物理结构 逻辑结构 :反映数据元素之间的逻辑关系,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。常见的逻辑结构有集合、线性结构、树形结构、图形结构。    集合 :数据结构中的元素之间除了同属一个集合”的相互关系外,别无其他关系。    线性结构 :数据结构中的元素存在一对一的相互关系。每个数据元素只有一个直接前驱和一个直接后继,线性结构有线性表,栈,队列,双队列,串,一般多维数组、广义表不是线性结构。    树形结构 :数据结构中的元素存在一对多的相互关系。且具有明显的层次关系,每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。树形结构可以表示从属关系、并列关系。数据结构中各种树形状都是树形结构。    图形结构 :数据结构中的元素存在多对多的相互关系。结点之间的关系可以是任意的,任意两个数据元素之间都可能相关,图形结构常被用于描述各种复杂的数据对象。 物理结构 :指数据的逻辑结构在计算机存储空间的存放形式。包括数据元素的机内表示和关系的机内表示,数据元素的机内表示指用二进制位的位串表示数据元素,称这种位串为节点。当数据元素有若干个数据项组成时,位串中与多个数据项对应的子位串称为数据域。关系的机内表示则可以分为顺序映像和非顺序映像