哈希表

手写哈希表

旧巷老猫 提交于 2020-02-29 19:16:38
情景: google公司上机题, 有一个公司,当有新员工来报到时,要求将该员工的信息加入(ID,姓名,年龄,地址),当输入员工的ID时,要求查找到该员工的所有信息 要求: 不使用数据库,速度越快越好====》言外之意,用hash表来完成 package com.datastructure.HashTableDemo; import java.util.Scanner; /** * google公司上机题 * * 有一个公司,当有新员工来报到时,要求将该员工的信息加入(ID,姓名,年龄,地址),当输入员工的ID时,要求查找到该员工的所有信息 * * 要求:不使用数据库,速度越快越好====》言外之意,用hash表来完成 */ public class HashTab { //测试一把 public static void main(String[] args) { HashT hashT = new HashT(5); boolean flag = true; while (flag){ System.out.println("add.添加元素"); System.out.println("del.删除元素"); System.out.println("find.查找元素"); System.out.println("list.展示元素"); System.out.println(

问题 B: 分组统计(哈希)

拈花ヽ惹草 提交于 2020-02-28 23:39:49
题目描述 先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。 输入 输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。 输出 输出m行,格式参见样例,按从小到大排。 样例输入 Copy 1 7 3 2 3 8 8 2 3 1 2 3 2 1 3 1 样例输出 Copy 1={2=0,3=2,8=1} 2={2=1,3=0,8=1} 3={2=1,3=1,8=0} 没给数的大小范围,这边随便开了10005,竟然没超过= =。定义了两个集合来存出现过的数字和出现过的组 #include<bits/stdc++.h> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char** argv) { int m, n; while(cin >> m) { for(int i = 0; i < m; i++) { cin >> n; int map[105][10005] = {0}; int a[n]; set<int> group_set,

哈希表

萝らか妹 提交于 2020-02-28 22:19:00
#include<iostream> #include<vector> using namespace std; struct listnode { int val; listnode* next; listnode(int x):val(x),next(NULL){} }; int hash_index(int key, int table_len) { return key % table_len; } void insert(listnode *table[], listnode* node, int table_len) { int index = hash_index(node->val, table_len); node->next = table[index]; table[index] = node; } bool hash_search(listnode *table[], int val, int table_len) { int index = hash_index(val,table_len); listnode* head = table[index]; while(head) { if(head->val == val) return true; head = head->next; } return false; } int main() {

坑系列 —— 缓存+哈希=高并发?

£可爱£侵袭症+ 提交于 2020-02-28 20:04:46
今天继续坑系列, 高可用 已经讲过了,当前互联网时代,怎么少的了 高并发 呢? 高并发 和 高可用 一样, 已经变成各个系统的标配了,如果你的系统QPS没有个大几千上万,都不好意思跟人打招呼,虽然可能每天的调用量不超过100。 高并发 这个词,我个人感觉是从电商领域开始往外流传的,特别是电商领域双11那种藐视全球的流量,再把技术架构出来分享一把,现在搞得全互联网都在说 高并发 ,而且你注意回忆一下所有你看到的高并发系统,往往都逃不开一个核心概念,那就是 缓存+哈希 ,一切都是以这个概念和基础的,仿佛这就是高并发的核心技术了。` 我们看到的高并发技术 围绕这个核心技术,通常我们看到的各种高并发的架构系统,在博客,论坛,现场分享出来的高并发系统,都跑不出以下几个方面的东西。 资源静态化 就是那种单个页面流量巨大无比,每秒的QPS几十万上百万的系统,确实 并发高的系统 ,核心解决方案就是静态化,靠机器和带宽去抗,假如没有CDN的话,所有流量都落到同一个IP下面的话,基本上也就是用Nginx的文件静态化了,单机的承受能力主要取决于带宽和单机的性能,要再多的话,那就 LVS(或者F5)+集群 了,这种的典型场景就是搞活动时候的首页,活动页面了,还有就是引流搜索引擎的着陆页了,一般都是现成的图片和文字静态化,当然,这种还有很多前端的技巧和技术了,这一点我不是很了解,就不得瑟了,就中后台来说

哈希表排序O(m+n)

寵の児 提交于 2020-02-28 13:28:01
#include<iostream> using namespace std; const int maxn = 1000; int main() { int nums[10] = { 12, 88, 66, 122, 43, 66, 88, 99, 666, 888}; int hash_map[maxn]={0}; for(int i = 0; i < 10; i++) { hash_map[nums[i]]++; } for(int i = 0; i < maxn; i++) { for(int j = 0; j < hash_map[i]; j++) { cout<<i<<" "; } } cout<<endl; return 0; } 哈希表排序优点:时间复杂度为O(表长+n) n为元素个数. 缺点:只能对正整数排序,且哈希表长度必须大于最大待排序数字. 来源: 51CTO 作者: wx5d3c7e0ad6c30 链接: https://blog.51cto.com/14472348/2474199

哈希表&散列表&HashMap

孤街醉人 提交于 2020-02-28 06:43:34
哈希表(Hashtable,也叫散列表),是根据关键码值而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫散列表。 记录的存储位置=f(关键字); 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表; f:将key转换成一个整型数字,然后将该数字对数组长度进行取余,取余结果作为数组的下标,将value存储在以该数字为下标的数组空间中; (好的散列函数=计算简单+计算得到的散列地址分布均匀) 数组的特点:寻址容易,插入和删除困难; 链表的特点:寻址困难,插入和删除容易; 那么,哈希表最常用的一种实现方式——拉链法,结合了二者的特性:左边是一个数组,数组的每个成员包括一个指针,指向一个链表的头,我们根据元素的一些特征把元素分配到不同的链表中去,之后也根据这些特征,找到这些链表,并从链表中找到这个元素; Hash的应用: 1.信息安全领域的加密算法。把不同长度的信息转换为杂乱的128位编码,称为Hash值,也可以说,Hash就是找到一种数据内容和数据存放地址之间的映射关系; 2.查找:以前的查找思路都是逐渐缩小查找范围,而Hash的思路是根据key值直接计算出元素在集合中的位置,根本不需要一次又一次的查找,非常适合海量数据处理,几乎是O(1)的时间复杂度; 优点:查找

干货分享,值得收藏:搞懂这些redis知识点,还怕干不过面试官?

爷,独闯天下 提交于 2020-02-28 00:49:45
是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义。redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们按照合理的格式解码后,可以变成一个字符串,整数或对象,此时才具有数据类型。 这一点必须要记住。所以任何东西只要能转化成字节数组(byte[])的,都可以存到redis里。管你是字符串、数字、对象、图片、声音、视频、还是文件,只要变成byte数组。 因此redis里的String指的并不是字符串,它其实表示的是一种最简单的数据结构,即一个key只能对应一个value。这里的key和value都是byte数组,只不过key一般是由一个字符串转换成的byte数组,value则根据实际需要而定。 在特定情况下,对value也会有一些要求,比如要进行自增或自减操作,那value对应的byte数组必须要能被解码成一个数字才行,否则会报错。 那么List这种数据结构,其实表示一个key可以对应多个value,且value之间是有先后顺序的,value值可以重复。 Set这种数据结构,表示一个key可以对应多个value,且value之间是没有先后顺序的,value值也不可以重复。 Hash这种数据结构,表示一个key可以对应多个key-value对,此时这些key

(数组)字符串的回文构词法( anagrams)

六月ゝ 毕业季﹏ 提交于 2020-02-27 07:03:41
题目:https://www.nowcoder.com/practice/e84e273b31e74427b2a977cbfe60eaf4?tpId=46&tqId=29130&tPage=3&rp=3&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking 思路:   首先简单介绍一下Anagram(回文构词法)。 Anagrams 是指由颠倒字母顺序组成的单词,比如“dormitory”颠倒字母顺序会变成“dirty room”,“tea”会变成“eat”。回文构词法有一个特点:单词里的字母的种类和数目没有改变,只是改变了字母的排列顺序。 For example: Input:   ["tea","and","ate","eat","den"] Output: ["tea","ate","eat"]   这里的思路比较简单:主要的方法就是利用哈希表来进行存储(将字符串作为索引,字符串的下标作为实值)。对给出的字符串数组一一进行遍历,每次单独的处理一个字符串: 这里有个技巧:可以将每个字符串都按字符大小排序,这样方便查找 如果该字符串不在哈希表中,就将他存储哈希表(字符串的值作为索引,下标作为实值) 如果找到一样的字符串,将该字符串存入res中:并且将与该字符串对应的那个匹配的anagrams字符串也存入res中

《剑指Offer》Java实现合集

风流意气都作罢 提交于 2020-02-26 09:41:32
本文参考自《剑指offer》一书,代码采用Java语言。 更多: 《剑指Offer》Java实现合集 题目    在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。 思路   创建哈希表,键值key为字符,值value为出现次数。第一遍扫描:对每个扫描到的字符的次数加一;第二遍扫描:对每个扫描到的字符通过哈希表查询次数,第一个次数为1的字符即为符合要求的输出。   由于字符(char)是长度为8的数据类型,共有256中可能,因此哈希表可以用一个长度为256的数组来代替,数组的下标相当于键值key,对应字符的ASCII码值;数组的值相当于哈希表的值value,用于存放对应字符出现的次数。 测试算例     1.功能测试(存在/不存在只出现一次的字符;全部都为只出现一次的字符)   2.特殊测试(null) Java代码 //题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出 //'b'。 public class FirstNotRepeatingChar { public char firstNotRepeatingChar(String str) { if(str==null) return '\0'; int[] repetitions = new int[256]; for(int i=0;i<256;i++)

数据结构的基本概念

喜夏-厌秋 提交于 2020-02-26 08:15:27
数据结构 一、线性表 1. 顺序存储结构(顺序表) 一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同情况下不同。 2. 链表 链表里面节点的地址不是连续的,而是通过指针进行链接的。 二、哈希表 1. 哈希的导入 数组的特点是:寻址容易,插入和删除困难; 链表的特点是:寻址困难,插入和删除容易。 那么,我们综合两者的特性,做出一种寻址容易,插入和删除也容易的数据结构,这就是哈希表。 下面是哈希表的一种实现方法:拉链法。 在图的左边是一个数组,数组的每个成员包括一个指针,指向一个链表的头,根据元素的特征将元素分配到不同的链表中去,我们也是根据这些特征,找到正确的链表,再从链表中找到正确的元素。 2. 哈希表 哈希表就是把Key通过一个固定的算法函数——哈希函数,转换成一个整形数字,然后就将该数字对数长度进行取余,取余结果当作数组的下标,将value存储在以该数字为下表的数组空间里。 3. 哈希表的优缺点 优点 时间少:无论哈希表中的数据量,我们在操作时的插入,删除,查询都只需要O(1)的时间级。 速度快:在日常程序中,在特定时间内哈希表的查找速度总比树快。 编程简单:相对树来讲,哈希表编程实现相对简单。 缺点 哈希表基于数组,数组创建后难以扩展,故当哈希表被基本填满时,性能下降会非常严重,所以在创立哈希表时我们必须清楚表中将要存储多少数据。