哈希表

字符串哈希-POJ3349-Snowflake Snow Snowflakes

谁说胖子不能爱 提交于 2020-03-07 18:47:58
字符串哈希-POJ3349-Snowflake Snow Snowflakes 题目: 有N片雪花,每片雪花由六个角组成,每个角都有长度。 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6。 因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花。 例如ai,1,ai,2,…,ai,6和ai,2,ai,3,…,ai,6,ai,1就是形状相同的雪花。 ai,1,ai,2,…,ai,6和ai,6,ai,5,…,ai,1也是形状相同的雪花。 我们称两片雪花形状相同,当且仅当它们各自从某一角开始顺时针或逆时针记录长度,能得到两个相同的六元组。 求这N片雪花中是否存在两片形状相同的雪花。 输入格式 第一行输入一个整数N,代表雪花的数量。 接下来N行,每行描述一片雪花。 每行包含6个整数,分别代表雪花的六个角的长度(这六个数即为从雪花的随机一个角顺时针或逆时针记录长度得到)。 同行数值之间,用空格隔开。 输出格式 如果不存在两片形状相同的雪花,则输出: No two snowflakes are alike. 如果存在两片形状相同的雪花,则输出: Twin snowflakes found. 数据范围 1≤n≤100000, 0≤ai,j<10000000 输入样例: 2 1 2 3 4 5 6 4 3 2

只出现一次的数字

做~自己de王妃 提交于 2020-03-07 13:54:55
single number(只出现一次的数字) 描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 哈希 用一个哈希表,遍历数组时,若当前元素不在哈希表中,则如哈希表,若已经在哈希表中了,则不是该元素,将该元素从哈希表中删除,哈希表中剩下的最后一个元素就是只出现一次的数字。 class Solution { public : int singleNumber ( vector < int > & nums ) { map < int , bool > hash ; for ( auto i : nums ) { if ( hash . find ( i ) != hash . end ( ) ) hash . erase ( i ) ; else hash [ i ] = true ; } return hash . begin ( ) - > first ; } } ; 异或 a ^ 0 = a a ^ a = 0 a ^ b ^ c = a ^ (b ^ c) 所以可以这么理解,所有有两个相同数组的异或后结果都为0,只剩下那一个数组和0异或。 class Solution { public : int singleNumber ( vector < int > & nums ) { int a = 0 ; int len

第二章 工作量证明和挖矿

时光毁灭记忆、已成空白 提交于 2020-03-07 09:56:00
概览 工作量证明拼图和难易度 挖矿 难易度共识 时间戳校验 累积难易度 验证测试 小结 概览 本章节我们将会在我们的玩具版区块链的基础上加入工作量证明(POW)的支持。在 第一章节 的版本中, 任何人都都可以在没有任何工作量证明的情况下添加一个区块到区块链中。 当我们引入工作量证明机制之后,一个节点必须要解开一个有相当计算量的拼图(POW Puzzle)之后,才能往区块链上添加一个新的区块。而去解开该拼图,通常就被称为挖矿。 引入工作量证明机制之后,我们还可以对一个新区块的产出时间作出大致的控制。大概的做法就是动态的改变拼图的难易程度来达到控制的效果:如果最近的区块产生的太快了,那么就将拼图的难度提升,反之,则将拼图的难度降低。 需要点出来的时,本章节中我们还没有引入 交易(Transaction) 这个概念。这就意味着矿工挖出一个区块后,并不会获得相应的奖励。 一般来说,在加密货币中,如果矿工挖到了一个区块,是应该获得一定量的币作为激励的。 工作量证明拼图和难易度 在上一个章节的区块链的基础上,我们将会为区块结构加入两个新的属性:difficulty和nonce。要弄清楚这俩货是干嘛用的,我们必须先对工作量证明拼图作一些必要的阐述。 工作量证明拼图是一个什么样的任务呢?其实就是去计算出一个满足条件的区块哈希。怎么才算满足条件呢?如果这个计算出来的哈希的前面的0的数目满足指定的个数

java集合之ArrayList,TreeSet和HashMap分析

我与影子孤独终老i 提交于 2020-03-07 08:19:45
java集合是一个重点和难点,如果我们刻意记住所有的用法与区别则是不太现实的, 之前一直在使用相关的集合类,但是没有仔细研究区别,现在来把平时使用比较频繁的一些集合 做一下分析和总结,目的就是以后在需要使用的时候能给找到适合的类。 说到集合,先来看看数组,Array和集合相比,主要的问题是不能动态的改变长度,也不能删除元素, 在某些场景下不适合使用,而集合的话会灵活很多。 集合中我们常用的3个接口是:List,Set和Map,而对应的实现类常用的有ArrayList,TreeSet和HashMap, 接下来就来总结一下这3个实现类的特点。 Collection 是层次结构中的根接口,JDK 不提供此接口的任何直接实现:它提供更具体的 子接口(如 Set 和 List)实现。 Set,无序的,一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2, 并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。 List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。 Map和Collection接口没有关系,Map包含了key-value对,key唯一,value不唯一。 接下来我们依次来说说最常用的ArrayList,TreeSet和HashMap。 1.

redisUtil

那年仲夏 提交于 2020-03-07 04:28:03
package com.neusoft.kms.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** Redis工具 @author albert.ding */ @Component public class RedisUtil { @Autowired private StringRedisTemplate stringRedisTemplate; /** 获取指定key的值 @param key @return @author albert.ding */ public String get(String key) { return stringRedisTemplate.opsForValue().get(key); } /** 设置指定key的值

数据库 redis底层实现

这一生的挚爱 提交于 2020-03-05 22:51:12
redis是一个存储键值对的内存数据库,并且持久化到磁盘。 1、简单动态字符串(Simple Dynamic String,简称SDS) 1)利用len记录字符串长度,使得strlen时间复杂度从O(N)变为O(1)。 // sds.h struct __attribute__ ((__packed__)) sdshdr64 { uint64_t len; // 字符串已用的长度 uint64_t alloc; // 分配的总长度 char buf[]; // 字符串内容 }; 2)利用类似vector的分配策略,append时预分配一倍空间,减少内存分配次数。 // sds.c/sdsMakeRoomFor if (avail >= addlen) return s; newlen = (len+addlen); if (newlen < SDS_MAX_PREALLOC) newlen *= 2; else newlen += SDS_MAX_PREALLOC; sdssetalloc(s, newlen); 2、双向链表(Doubly Linked List) 1)利用len,使得计算链表长度的时间复杂度从O(N)变为O(1)。 2)表头和表尾插入元素的时间复杂度都是O(1)。注:这是所有双向链表的特性。 // adlist.h typedef struct listNode

第二节 redis的数据类型和一些通用的键命令

廉价感情. 提交于 2020-03-05 15:08:13
数据结构   Redis是key-value的数据结构,每条数据都是一个键值对   键的类型是字符串   注意:键不能重复 值的类型分为5种:   字符串 string   哈希 hash   列表 list   集合 set   有序集合 zset    常用键命令    Redis命令参考文档:http://doc.redisfans.com   key* 查看当前库的所有键   key a* 查看名称中包含a的键   exists key 判断键是否存在,存在返回1,不存在返回0   type key 查看键对应的value的类型   del key1 key2 key3... 删除键及对应的值   expire key seconds 对已存在的键设置过期时间,以秒为单位,如果没有指定过期时间则一直存在,知道被del   ttl key 查看剩下的有效时间,以秒为单位 来源: https://www.cnblogs.com/kogmaw/p/12419932.html

哈希表

为君一笑 提交于 2020-03-05 00:38:36
一、介绍 哈希表是根据关键字(Key)而 直接访问记录 的数据结构。它通过把 关键字 映射到哈希表中的 一个位置 来访问 记录 ,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。 散列函数:将记录的关键字映射到该记录在哈希表中的存储位置,即 f(关键字) = 记录的存储位置 示例:以查新华字典为例,假设我们要查看“猪”的详细信息,我们一般会根据拼音“zhu”去查找拼音索引,通过拼音索引我们得到了“zhu”在字典中的页码数。其中, 拼音索引就是 散列函数 ,“zhu”就是 关键字 ,查到的页码值就是 哈希值 ,而“猪”的详细信息则是我们所 要访问的记录 。 二、哈希冲突 哈希冲突:当key1≠key2时,却有f(key1) = f(key2) 。 三、拉链法 当发生哈希冲突时,我们通过两个不同的关键字,将访问到同一个记录。既然它们在哈希表中的存储位置相同,那我们可以在该位置 引出一个链表 ,将所有根据散列函数定位到该存储位置的记录都插入到该链表上。 这是哈希表最常用的一种实现方法,可以理解为“链表的数组”,其具有以下优点:   a.寻址容易(数组的特点)   b.插入和删除容易(链表的特点) 所以查找、插入、删除(有时包括删除)可以达到O(1)。 示例:现有一堆数据{1, 12, 26, 337, 353...},散列函数是H(key)=key mod 16

C#的集合类型及使用技巧

Deadly 提交于 2020-03-04 18:51:01
在日常开发过程中,我们不能避免的要对批量数据处理,这时候就要用到集合。集合总体上分为线性集合和非线性集合。线性集合是指元素具有唯一的前驱和后驱的数据结构类型;非线性集合是指有多个前驱和后驱的数据结构类型,如树和图。我们这里主要讲常用的线性集合,常用的线性集合有数组、ArrayList、List、Hashtable(哈希表)、Dictionary(字典)、Stack(堆栈集合)、Queue(队列集合)等。 一、数组 数组是一个存储相同类型元素的固定大小的顺序集合。数组属于引用类型,它继承System.Array类,System.Array是所有数组的基类。 1、一维数组 一维数组声明方式: //声明一个长度为5的int类型一维数组 int[] numbers = new int[5]; 一维数组的初始化方式有以下三种写法: //一维数组的初始化方式 int[] numbers1 = new int[5] {1,2,3,4,5};//指定大小和元素,使用条件是数组大小必须与元素个数相匹配。 int[] numbers2 = new int[] {1,2,3,4,5};//不指定数组大小,因为编译器会自动统计元素的个数。 int[] numbers3 = { 1, 2, 3, 4, 5 };//这是更简化的形式,直接使用花括号声明和初始化数组。 访问数组元素: 在声明和初始化数组后

MySQL——索引

牧云@^-^@ 提交于 2020-03-04 15:51:44
1 索引的常见模型 1.1 哈希表 哈希表是一种以键-值(key-value)存储数据的结构,只要输入待查找的键key, 就可以找到对应的值value。 哈希表适用于做等值查询(即查找的key值在表中有对应),但是哈希索引做区间查询的速度是很慢的 1.2 有序数组 查找数据的时间复杂度是O(log(N))。仅看查询效率,有序数组是一种非常好的数据结构,但是更新数据比较慢,因为要做数据的挪动工作。所以,有序数据只适用于静态存储引擎。 1.3 N叉搜索树 多叉树就是每个结点有多个儿子,儿子之间的大小保证从左到右递增。二叉搜索树效率是最高的,但是实际大多数的数据库存储并不使用二叉树,原因是,索引不止存在内存中,还要写到磁盘上。为了尽量少地读磁盘,一般使用N叉树。N取决于数据块的大小。 2 InnoDB的索引模型 2.1主键索引与非主键索引 在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式称为索引组织表。InnoDB使用B+树索引模型,所以数据都是存储在B+树中的。 索引类型分为 主键索引 和 非主键索引 。 主键索引 的叶子结点是整行数据。在InnoDB中,主键索引也被称为聚簇索引(clustered index)。 非主键索引 的叶子结点是主键的值。在InnoDB中,非主键索引也被称为二级索引。 2.2 索引维护 自增主键是指自增列上定义的主键,在建表语句中一般是