首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

哈希表、哈希冲突

负载因子(加载因子):减少链表长度 低效扩容:乘以2进行扩容 加载因子越大,哈希表中存储的元素越多,空闲的位置就越少,哈希冲突的概率就越大,插入、删除和查找数据时的性能就随之降低。...链表法:链地址法,在具体的应用中使用较多,在哈希表中每个桶对应一个链表,把哈希值相同的元素存放在相同桶位置的对应链表中,由于需要对比key值所以插入时间复杂度为O(k),查找和删除时的时间复杂度与链表的长度成正比...负载因子用于间接的限定链表的长度,如果值越大则允许的链表长度越大,哈希表的性能越差,但是加载因子越小空间浪费越严重。...当加载因子较大时会导致大量的探测行为操作,性能会急剧下降,同时删除数据也很麻烦,而且比链表法需要占用更多的存储空间。数据量比较小、负载因子小的时候适合开放地址法。...链表法数据存储在链表中,对内存的利用率比开发地址法高一些,可以容忍比较大的装载因子,由于节点中需要存储next指针,会消耗额外的内存空间【有效载荷问题】。

79210

经典算法——二分查找

任何被明确定义的计算过程都可以称作 算法 ,它将某个值或一组值作为输入,并产生某个值或一组值作为输出。所以 算法可以被称作将输入转为输出的一系列的计算步骤 。 说白了就是步骤明确的解决问题的方法。...在现在的计算机硬件环境中,比较少需要考虑这个问题了,特别是pc机的编程, 内存空间 越来越大,所以被考虑得也越来越少,不过一个好的程序员,都应该对自己的程序有要求,每一个for比别人少一次判断1000个...空间复杂度需要考虑在运行过程中为 局部变量分配的存储空间的大小 ,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。...空间复杂度也就是对一个算法在运行过程中 临时占用存储空间大小 的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。 3....该算法的前提要求是 元素已经有序 ,因为算法的核心思想是尽快的缩小搜索区间,这就需要保证在缩小范围的同时,不能有元素的遗漏。

36940
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数据库字段及索引设计规范

    优先选择符合存储需要的最小的数据类型1 原因:列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多,索引的性能也就越差。...尽可能把所有列定义为 NOT NULL 原因:索引 NULL 列需要额外的空间来保存,所以要占用更多的空间;进行比较和计算时要对 NULL 值做特别的处理 5....) 缺点 1:无法用日期函数进行计算和比较 缺点 2:用字符串存储日期要占用更多的空间 6....同财务相关的金额类数据必须使用 decimal 类型 非精准浮点:float,double 精准浮点:decimal Decimal 类型为精准浮点数,在计算时不会丢失精度;占用空间由定义的宽度决定,每...区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数) 尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好) 使用最频繁的列放到联合索引的左侧

    1.1K20

    面试官:如何给字符串设计索引?

    ,发现仍然是 javafish,取出 ID2,再到 ID 索引上取整行然后判断,还是不对; 重复上一步,直到在 index_url 上取到的值不是 javafish 时,循环结束。...索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。 那还有别的方法既能保证区分度又能不占用那么多空间吗?...= crc32('输入的 url 字符串') and url = '输入的 url 字符串' 如此一来,就相当于把 url 的索引长度降低到 4 个字节,缩短存储空间的同时提高了查询效率。...它们的区别,主要体现在以下三个方面: 从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而 hash 字段方法需要增加一个字段。...没有办法判断哪一种最好,只有最合适的。在开发中,你也需要根据业务来选择,总的方向就是:提高区分度 & 尽量 减少占用空间。

    64320

    十大经典排序算法 -- 动图讲解

    计数排序 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。...由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。...由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。...什么时候最快 当输入的数据可以均匀的分配到每一个桶中。 2. 什么时候最慢 当输入的数据被分配到了同一个桶中。 3. 示意图 元素分布在桶中: ? 然后,元素在每个桶中排序: ?...很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

    1.4K50

    值得收藏:一份非常完整的 MySQL 规范

    (表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作) 7、禁止在表中建立预留字段 预留字段的命名很难做到见名识义...1、优先选择符合存储需要的最小的数据类型 · 原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差...原因: · 索引NULL列需要额外的空间来保存,所以要占用更多的空间; · 进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    76230

    值得收藏:一份非常完整的 MySQL 规范

    (表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作) 7、禁止在表中建立预留字段 预留字段的命名很难做到见名识义...1、优先选择符合存储需要的最小的数据类型 · 原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差...原因: · 索引NULL列需要额外的空间来保存,所以要占用更多的空间; · 进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    90130

    值得收藏:一份非常完整的 MySQL 规范(一)

    尽量做到冷热数据分离,减小表的宽度 MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节 减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大...优先选择符合存储需要的最小的数据类型 原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差...尽可能把所有列定义为 NOT NULL 原因: 索引 NULL 列需要额外的空间来保存,所以要占用更多的空间。 进行比较和计算时要对 NULL 值做特别的处理。 5....TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高,超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储。...占用空间由定义的宽度决定,每 4 个字节可以存储 9 位数字,并且小数点要占用一个字节。可用于存储比 bigint 更大的整型数据。 四、索引设计规范 1.

    72910

    超长字符串字段,前缀索引两宗罪

    InnoDB 表中每一列索引的最大长度不能超过 767 字节,所以,对于某些比较长的字段,如果确实有建立索引的必要,使用前缀索引不仅能够避免索引长度超过限制,而且相对于普通索引来说,占用的空间和查询成本更小...发现 email 前缀不满足 'zhangs2',则执行结束 可以看到,相对于普通索引,email(7) 这个前缀索引同样只需要回表一次,并且占用更少的索引空间。...如何定义前缀索引的长度 索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。...在上面的例子中我们提到,只需要把前缀索引从 email(6) 改成 email(7),就可以大大减少记录扫描和回表的次数,所以,在定义前缀索引的时候,我们需要在占用空间和搜索效率之间做一个权衡 trade-off...,所以我们在查询语句的 where 部分还需要进行一次精确判断 # 假设输入的字段是 input_a select * from user where hash(input_a) = a_hash and

    56810

    MySQL 高性能优化规范建议

    优先选择符合存储需要的最小的数据类型 原因: 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多,索引的性能也就越差。...尽可能把所有列定义为 NOT NULL 原因: 索引 NULL 列需要额外的空间来保存,所以要占用更多的空间 进行比较和计算时要对 NULL 值做特别的处理 5....,则从磁盘中读入的数据也就越少。...在 MySQL 中,对于同一个 SQL 多关联(join)一个表,就会多分配一个关联缓存,如果在一个 SQL 中关联的表越多,所占用的内存也就越大。...推荐在程序中获取一个随机值,然后从数据库中获取数据的方式。 13.

    49410

    今儿聊一聊Mysql的性能优化

    优先选择符合存储需要的最小的数据类型 原因: 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多,索引的性能也就越差。...尽可能把所有列定义为NOT NULL 原因: 索引NULL列需要额外的空间来保存,所以要占用更多的空间 进行比较和计算时要对NULL值做特别的处理 5....2:用字符串存储日期要占用更多的空间 6....在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。...推荐在程序中获取一个随机值,然后从数据库中获取数据的方式。 13.

    63570

    MySQL高性能优化规范建议,值得收藏

    优先选择符合存储需要的最小的数据类型 原因: 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多,索引的性能也就越差。...尽可能把所有列定义为 NOT NULL 原因: 索引 NULL 列需要额外的空间来保存,所以要占用更多的空间 进行比较和计算时要对 NULL 值做特别的处理 5....,则从磁盘中读入的数据也就越少。...在 MySQL 中,对于同一个 SQL 多关联(join)一个表,就会多分配一个关联缓存,如果在一个 SQL 中关联的表越多,所占用的内存也就越大。...推荐在程序中获取一个随机值,然后从数据库中获取数据的方式。 13.

    1.2K41

    MySQL规范

    原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差 方法 1)将字符串转换成数字类型存储,如:...原因: 1、索引NULL列需要额外的空间来保存,所以要占用更多的空间; 2、进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。...如a like '%123%',(如果无前置%,只有后置%,是可以用到列上的索引的) 一个SQL只能利用到复合索引中的一列进行范围查询 如:有 a,b,c列的联合索引,在查询条件中有a列的范围查询,则在...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    1.3K20

    一张表到底建多少个索引才是合适呢?

    哈希函数会将索引键值(如数据库表中的某个字段值)作为输入,通过特定的算法运算,生成一个固定长度的哈希值。 查询速度快,但不支持范围查找 B 树(btree)索引 一种平衡的多叉树数据结构。...B 树索引会将表中的索引键值按照一定的顺序(如升序或降序)存储在树的节点中。每个节点可以存储多个键值以及指向其他节点的指针。 支持范围查询,但占用空间较大 2、新建索引的规范原则有哪些?...2.2 尽量选择区分度高的列作为索引 区分度的公式是:count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少。...从数据库设计和架构的角度,理论上只要满足以下条件,就可以新增创建索引: 存储空间允许:每个索引都需要占用一定的磁盘空间来存储索引数据结构,所以只要磁盘空间足够容纳新创建的索引结构及其相关数据,在空间层面就不会因空间不足而无法创建索引...只要系统整体性能(包括查询性能和更新性能等)在可接受的范围内,理论上可以继续创建索引。 4.2 实际应用情况 然而在实际应用场景中,通常不会无限制地创建索引。

    8510

    一份完整的 MySQL 开发规范,进大厂必看!

    (表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作) 7、禁止在表中建立预留字段 预留字段的命名很难做到见名识义...1、优先选择符合存储需要的最小的数据类型 原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差...原因: 1、索引NULL列需要额外的空间来保存,所以要占用更多的空间; 2、进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    84320

    一份完整的 MySQL 开发规范,进大厂必看!

    (表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作) 7、禁止在表中建立预留字段 预留字段的命名很难做到见名识义...1、优先选择符合存储需要的最小的数据类型 原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差...原因: 1、索引NULL列需要额外的空间来保存,所以要占用更多的空间; 2、进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间...如a like '%123%',(如果无前置%,只有后置%,是可以用到列上的索引的) 一个SQL只能利用到复合索引中的一列进行范围查询 如:有 a,b,c列的联合索引,在查询条件中有a列的范围查询,则在...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    1.4K20

    【值得收藏】一份非常完整的Mysql规范

    三、数据库字段设计规范 1、优先选择符合存储需要的最小的数据类型 原因 :列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多...: 索引NULL列需要额外的空间来保存,所以要占用更多的空间; 进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间 TIMESTAMP...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。...如a like ‘%123%’,(如果无前置%,只有后置%,是可以用到列上的索引的) 一个SQL只能利用到复合索引中的一列进行范围查询 如:有 a,b,c列的联合索引,在查询条件中有a列的范围查询,则在...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    46720

    值得收藏:一份非常完整的 MySQL 规范

    · 原因 列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多, 索引的性能也就越差 · 方法 1)将字符串转换成数字类型存储...原因: · 索引NULL列需要额外的空间来保存,所以要占用更多的空间; · 进行比较和计算时要对NULL值做特别的处理 5、使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。...如a like '%123%',(如果无前置%,只有后置%,是可以用到列上的索引的) · 一个SQL只能利用到复合索引中的一列进行范围查询 如:有 a,b,c列的联合索引,在查询条件中有a列的范围查询,...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    97330

    史上最全的MySQL高性能优化规范建议

    ,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的IO次数也就越多,索引的性能也就越差。...列需要额外的空间来保存,所以要占用更多的空间 进行比较和计算时要对NULL值做特别的处理 5)使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间 TIMESTAMP 存储的时间范围...占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节,可用于存储比bigint更大的整型数据。...一个SQL只能利用到复合索引中的一列进行范围查询 如 有 a,b,c列的联合索引,在查询条件中有a列的范围查询,则在b,c列上的索引将不会被用到, 在定义联合索引时,如果a列要用到范围查找的话,就要把a...在Mysql中,对于同一个SQL多关联(join)一个表,就会多分配一个关联缓存,如果在一个SQL中关联的表越多,所占用的内存也就越大。

    1.6K20

    贪心与二分-二分答案

    ; 图片 如果不满足条件,则更小的值就不用找,因为它们都不满足条件C(x),缩小范围,在更大的值中寻找是否有满足条件的值。...C ans=mid;//满足条件,则更新结果 lb=mid+1;//寻找满足条件的最大值,故在更大值的范围内继续寻找 //缩小寻找范围: mid+1 ~...在最大化问题中,若mid满足条件,此时值要越大越好,故范围缩小至右侧值更大的部分, lb=某个值,此时使用端点存储答案,所以将mid也包括进去。即 l=mid。循环结束时,最优值存放在端点l中。...累加每段数目能获得的木材长度,将总长度与m进行比较,大于等于m则满足条件。 此时满足条件的基础上,值越大越好,故范围缩小至右侧值更大的区域内,否则,范围缩小至左侧值更小的区域内。...统计最多能安排的牛的总数,将它与C进行比较,能大于等于C则说明可以安排下C头牛。 此时,满足条件的基础上,值越大越好,故范围缩小至右侧值更大的区域, l=mid+1。

    29020
    领券