哈希表

redis底层实现的几种数据结构

匆匆过客 提交于 2019-12-02 01:51:47
redis底层数据结构 一、简单动态字符串(SDS) 定义: struct sdshdr{   int len; //SDS所保存的字符串长度   int free //记录buf数组中为使用的字节数量,预留内存长度   char buf[] //字节数组,用于保存字符串 } SDS与C字符串的区别及特点: 1)获取字符串长度:   C字符串:遍历整个字符串,直至遇到结束符为止,复杂度为O(n)。   SDS:在len中记录了本身的长度,所以获取一个SDS长度的复杂度为O(1)。 2)杜绝缓存区溢出   C字符串:不记录本身的长度,当将一个字符串拼接到另一个字符串的末尾时,如果内存不够多的话,就会产生缓存区的溢出。   SDS:在进行拼接之前,会先检查给定的SDS空间是否足够,如果不够,会先扩展SDS的空间,然后才执行拼接操作。 3)减少内存重新分配次数   SDS:通过空间预分配额外空间作为保留使用,从而减少内存的重分配为题。   额外分配空间数量的公式:     1、当SDS的长度小于1MB的时候,分配与len属性的值相同长度的内存作为预存。(实际上所有的长度将多一字节保存空字符)     2、当SDS的长度大于等于1MB的时候,那么程序会分配1MB的未使用空间。 4)惰性空间释放   SDS的API需要缩短SDS保存的字符串时

141.环形链表

我只是一个虾纸丫 提交于 2019-12-02 00:26:21
1.题目描述:   给定一个链表,判断链表中是否有环。 2.思路以及代码:   建立一个哈希表,然后遍历链表,每遍历一个结点就将其加入哈希表中,如果当前结点已存在于哈希表中,存在环形。   代码如下: /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public boolean hasCycle(ListNode head) { HashSet<ListNode>set=new HashSet<ListNode>(); while(head!=null) { if(set.contains(head)) return true; else set.add(head); head=head.next; } return false; } } 代码参考:力扣官方题解: https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode/ 来源: https://www.cnblogs

哈希表相关题目-leetcode简单

梦想的初衷 提交于 2019-12-02 00:23:17
1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 不能使用双指针方法,因为数组是无序的;虽然可以对数组排序,但是排序后的数组索引位置改变,而本题需要返回索引位置。 1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int> res; 5 sort(nums.begin(), nums.end()); //排序后索引位置就变了 6 int f=0,b=nums.size()-1; 7 while(f<b){ 8 if(nums[f]+nums[b]==target){ 9 return vector<int>{f,b}; 10 }else if(nums[f]+nums[b]>target){ 11 b--; 12 }else{ 13 f++; 14 } 15 } 16 return res; 17 } 18 };

模拟82 题解

…衆ロ難τιáo~ 提交于 2019-12-02 00:17:22
A. D2T1 因为最终答案只需要大小为$n$的排列的返回值的期望。 我们并不关注排列内部的内容。 所以不妨设长度为$n$的排列的返回值的期望为$f_n$,长度为$n$的排列的逆序对个数为$g_n$。 那么有$f_n=\frac{\sum \limits_{i=0}^{n}\binom{n}{i}*f_i}{2^n}+g_n$。 显然随机排列中正序对和逆序对个数应当是相同的,并且二者相加为$\frac{n*(n-1)}{2}$,故$g_n=\frac{n*(n-1)}{4}$。 然而受到$D1T2$的启发,我们应当也可以想到$g_n$的另一个求法。 考虑从大到小插入每一个数。 那么插入第$i$个数的贡献为$\frac{\sum \limits_{j=0}^{i-1}j}{i}$,分别表示插入到第$j$个空位造成的逆序对贡献。 由此我们是可以推出上式的。 于是我们可以$O(n^2)$解出$f_n$,对$f_n$作前缀和后除$n$即为$ans_n$。 显然有了这个算法后,我们应当打表。 然后就会发现$f_n$这个函数就非常好,对它邻项作差一次立刻变成了等差数列。 也就是说它必是二次函数,所以$f_n$的前缀和必为三次函数。 所以设$s_n$为$f_n$的前缀和,$s_n=a*x^3+b*x^2+c*x+d$。 分别代入$x=1,2,3,4$,可以解出$a,b,c,d$,除$n

Redis 系列(02)数据结构

Deadly 提交于 2019-12-02 00:10:28
目录 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 1.2 数据结构 1.3 Redis数据存储结构 2. Hash 2.1 基本操作 2.2 数据结构 3. List 3.1 基本操作 3.2 数据结构 4. Set 4.1 基本操作 4.2 数据结构 5. Sorted Set 5.1 基本操作 5.2 数据结构 6. hyperloglogs 7. geospatial 8. 总结 Redis 系列(02)数据结构 Redis 系列目录 1. String 1.1 基本操作 mset str 2673 jack 666 setnx str incr str incrby str 100 decr str decrby str 100 set f 2.6 incrbyfloat f 7.3 mget str jack strlen str append str good getrange str 0 8 1.2 数据结构 String 字符串类型的内部编码有三种: int,存储8个字节的长整型(long,2^63-1)。 embstr SDS(Simple Dynamic String),存储小于44 个字节的字符串。。 raw SDS,存储大于 44 个字节的字符串。 数据结构示例: 127.0.0.1:6379> set k1

python面试题整理(二)

旧时模样 提交于 2019-12-01 22:42:42
1、进程,线程,协程定义,有什么区别    进程是操作系统分配资源的最小单位,一个进程对应一块CPU   线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至少要有一个线程   协程是更加轻量级的存在,不是由CPU进程管理而是由程序员管理,在执行一个函数过程中可以中断执行另一个函数,执行一个函数过程就叫协程,python3以前使用 yield 表示协程,yield关键字一般用于做生成器,实现在函数中暂停的效果,python3.3以后出现 yield from 后面跟可迭代对象,3.5以后使用 async和await 实现原生协程。     区别:     (1) 线程之间切换是由操作系统决定的 ,切换速度特别快,但是切换频率太高, 协程之间切换由程序决定 ,不会像线程切换那么耗费资源,在高并发下执行效率更高,   性能更优     (2)协程中控制共享资源不加锁     (3)协程使用同步的方式实现异步,在单进程里实现任务切换 2、子进程是什么    在一个进程中创建开启另一个进程,这个进程称为子进程,即在父进程中创建的进行 3、僵尸进程知道吗    父进程还在执行,子进程执行完毕后不会立即退出,操作系统会清理内存空间,但是保留进程号(pid),等待父进程清理资源,这个时候子进程成为僵尸进程 4、线程和协程有什么区别     

JavaSE--单列集合的使用

做~自己de王妃 提交于 2019-12-01 21:10:07
单列集合是我们写Java代码中经常会用到的一种存储容器. 在这里我总结了一些关于这一块的知识供各位博友参考, 希望能与大家多多交流(逃)~ 首先给大家放一张关于单列集合的思维导图. 单列集合顶层Collection集合是一个接口. 平时我们经常用到的主要有List链表和Set集合. List 接口特点:有序,带索引,元素可重复,线程不安全效率高. List接口常用的实现类有三个 ArrayList,LinkedList,Vector. ArrayList 集合的数据存储结构为 数组结构 , 元素查询快,增删慢.常用来查询数据和遍历数据.(注:由于ArrayList线程不安全,方法的实现是不同步的.多线程中执行可能会出现数据异常) Linkedlist 集合的数据结构是 链表 ,查询慢,增删快,线程不安全效率高.常用来进行元素的添加删除.由于存储结构是链表结构. 方便元素添加,删除操作.并提供大量首尾操作的方法(实际中常用) (注:由于LinkedList线程不安全,方法的实现是不同步的.多线程中执行可能会出现数据异常) Vector 集合的数据存储结构是数组结构.线程安全效率低 是JDK早期提供的集合,提供枚举Enumeration(早期的迭代器,已被Iterator所替代) Set接口 (元素唯一) Set 集合是一个不包含重复元素的集合

Redis数据库

≯℡__Kan透↙ 提交于 2019-12-01 20:51:35
1、Redis概念   Redis是一个key-value 存储系统 。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list( 链表 )、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些 数据类型 都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 2、Redis应用案例   1)微博大V的微博数据被存放于高速缓存中,普通人的微博存放于普通NoSQL数据库里   2)门户网站、电商网站、视频网站首页的内容都需要缓存(属于热数据)   3)双十一购物狂欢节,电商平台要利用高速的缓存来弥补数据库吞吐能力不足。订单先被缓存,然后负载低谷期,再写入数据库   4)电商平台秒杀/抢购业务需要用高速缓存来实现顺序操作-(解决支付的时候才提醒库存不足的问题)(单线程-栈队)   5)可以存放短时间内的数据(如验证码) 3、Redis的目录结构 为了防止意外宕机丢失数据,Redis提供了两种持久化的方式 RDB

Set接口

…衆ロ難τιáo~ 提交于 2019-12-01 16:30:16
Set    定义     set中不允许放入重复的元素(元素相同时只取一个)。它使用equals()方法进行比较,如果返回true,两个对象的HashCode值也应该相等。   特点:       Set 接口是无序的     Set 是继承于 Collection 的接口。它是一个不允许有重复元素的集合。      Set 可以存储null值,但是null不能重复     Set的实现类都是基于 Map 来实现的( HashSet 是通过 HashMap 实现的, TreeSet 是通过 TreeMap 实现的)。   例: 1 public class Demo02 { 2 public static void main(String[] args) { 3 Set<String> set=new HashSet<String>(); 4 set.add("hello"); 5 set.add("java"); 6 set.add("hello"); 7 for(String s:set){ 8 System.out.println(s); 9 } 10 } 11 }   如图所示:      HashSet   是实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

Java-对象相等判断

我只是一个虾纸丫 提交于 2019-12-01 16:16:32
Java-对象相等判断 引用相等性和对象相等性 引用相等性 对象相等性 equals和hashCode equals JDK中说明了实现equals()方法应该遵守的约定: hashCode hash码相同的情况 hash码不相同的情况 JDK中对hashCode()方法的作用,以及实现时的注意事项做了说明: 重写equals和hashCode例子 引用相等性和对象相等性 引用相等性 两个引用指向堆上同一个对象,成为引用相等 对象相等性 堆上两个对象使用equals方法+hashCode方法 都为true时 认为两个对象是相等的 if (a.equals(b) && a.hashCode() == b.hashCode()) { // 两个引用指向同一个对象或者两个对象是相等的 } equals和hashCode equals java中所有的类都集成自Object类,Object对equals方法的实现如下 public boolean equals(Object obj) { return (this == obj); } 因此在未对Object的equals方法做覆盖的时候,equals方法和"=="是相同的效果 equals通常用来比较两个对象的内容是否相等 ==用来比较两个对象的地址是否相等。 JDK中说明了实现equals()方法应该遵守的约定: 1)自反性:x