mysql map数据结构_学习Redis你必须了解的数据结构——HashMap实现

本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws .

首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的文章,链接在尾部给出:

var djb2Code = function (str) {

var hash = 5381;

for (i = 0; i < str.length; i++) {

char = str.charCodeAt(i);

hash = ((hash << 5) + hash) + char; /* hash * 33 + c */

}

return hash;

}

接下来我们用js实现hashmap, hashmap是一种键值对的数据结构。意味着你可以通过key快速找到你所需要查找的值。我使用数组加上LinkedList来实现hashmap,这种方式也被称为解决hashcode冲突的分离链接法。hashmap通常具备以下几种方法:put,get,remove。put是写入和修改数据,在put数据时,首先获取key的hashcode,作为数组的索引。而数组索引对应的值则是一个linkedlist,并且linkedlist所存储的节点值,同时包含着所需存储的key和value。这样以便解决当hashcode重复冲突时,在链表中根据key名称来get查找值。 关于hashmap更多的原理,我推荐这篇文章 http://www.admin10000.com/document/3322.html

下面直接给出实现,其中使用到LinkedList数据结构的源码,在我的这篇分享当中:http://www.cnblogs.com/tdws/p/6033209.html

var djb2Code = function (str) {

var hash = 5381;

for (i = 0; i < str.length; i++) {

char = str.charCodeAt(i);

hash = ((hash << 5) + hash) + char; /* hash * 33 + c */

}

return hash;

}

function HashMap() {

var map = [];

var keyValPair = function (key, value) {

this.key = key;

this.value = value;

}

this.put = function (key, value) {

var position = djb2Code(key);

if (map[position] == undefined) {

map[position] = new LinkedList();

}

map[position].append(new keyValPair(key, value));

},

this.get = function (key) {

var position = djb2Code(key);

if (map[position] != undefined) {

var current = map[position].getHead();

while (current.next) {

if (current.element.key === key) { //严格判断

return current.element.value;

}

current = current.next;

}

if (current.element.key === key) {//如果只有head节点,则不会进while. 还有尾节点,不会进while,这个判断必不可少

return current.element.value;

}

}

return undefined;

},

this.remove = function (key) {

var position = djb2Code(key);

if (map[position] != undefined) {

var current = map[position].getHead();

while (current.next) {

if (current.element.key === key) {

map[position].remove(current.element);

if (map[position].isEmpty()) {

map[position] == undefined;

}

return true;

}

current = current.next;

}

if (current.element.key === key) {

map[position].remove(current.element);

if (map[position].isEmpty()) {

map[position] == undefined;

}

return true;

}

}

}

}

//链表

function LinkedList() {

var Node = function (element) {        //新元素构造

this.element = element;

this.next = null;

};

var length = 0;

var head = null;

this.append = function (element) {

var node = new Node(element);        //构造新的元素节点

var current;

if (head === null) {             //头节点为空时 当前结点作为头节点

head = node;

} else {

current = head;

while (current.next) {          //遍历,直到节点的next为null时停止循环,当前节点为尾节点

current = current.next;

}

current.next = node;            //将尾节点指向新的元素,新元素作为尾节点

}

length++;                    //更新链表长度

};

this.removeAt = function (position) {

if (position > -1 && position < length) {

var current = head;

var index = 0;

var previous;

if (position == 0) {

head = current.next;

} else {

while (index++ < position) {

previous = current;

current = current.next;

}

previous.next = current.next;

}

length--;

return current.element;

} else {

return null;

}

};

this.insert = function (position, element) {

if (position > -1 && position <= length) {        //校验边界

var node = new Node(element);

current = head;

var index = 0;

var previous;

if (position == 0) {                    //作为头节点,将新节点的next指向原有的头节点。

node.next = current;

head = node;                        //新节点赋值给头节点

} else {

while (index++ < position) {

previous = current;

current = current.next;

}                                //遍历结束得到当前position所在的current节点,和上一个节点

previous.next = node;                    //上一个节点的next指向新节点 新节点指向当前结点,可以参照上图来看

node.next = current;

}

length++;

return true;

} else {

return false;

}

};

this.toString = function () {

var current = head;

var string = '';

while (current) {

string += ',' + current.element;

current = current.next;

}

return string;

};

this.indexOf = function (element) {

var current = head;

var index = -1;

while (current) {

if (element === current.element) {            //从头节点开始遍历

return index;

}

index++;

current = current.next;

}

return -1;

};

this.getLength = function () {

return length;

};

this.getHead = function () {

return head;

};

this.isEmpty = function () {

return length == 0;

}

}

78d19a41ab139fed4f33edb2c236fc58.png

参考文章:js获取hashcode  : http://www.cnblogs.com/pigtail/p/3342977.html

如果我的点滴分享对你有点滴帮助,欢迎点击下方红色按钮,我将长期输出分享。

学习Redis你必须了解的数据结构——JS实现集合和ECMA6集合

集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...

学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

在微博微信场景下学习Redis数据结构

Redis安装 下载地址:http://redis.io/download 安装步骤: 1.yum install gcc 2.wget http://download.redis.io/releas ...

Redis源码分析-底层数据结构盘点

前段时间翻看了Redis的源代码(C语言版本,Git地址:https://github.com/antirez/redis), 过了一遍Redis数据结构,包括SDS.ADList.dict.ints ...

聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O&lpar;logn&rpar;&lpar;阿里&rpar;

redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的.B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试) 还有个几个姊妹篇:介绍 ...

Redis&lpar;1&rpar;——5种基本数据结构

一.Redis 简介 "Redis is an open source (BSD licensed), in-memory data structure store, used as a d ...

学习Redis好一阵了,我对它有了一些新的看法

前言 本篇文章不是一篇具体的教程,我打算记录一下自己对Redis的一些思考.说来惭愧,我刚接触Redis的时候只是简单地使用了一下,背了一些面试题,就在简历上写下了Redis这个技能点. 我们能在网络 ...

学习Redis从这里开始

本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例代码与Redis进行简单的互动 使用Redis解决实际问题 Redis是一个远程内存数据库,它不仅性能强劲 ...

深入学习Redis(1):Redis内存模型

前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

随机推荐

vue vue-cli安装

npm 更新 cnpm install -g npm Vue 的基本用法 Vue 相比于 React 和 Angular 容易上手多了,因此我对 Vue 的学习主要以文档为主,视频为辅(只有像我这种菜 ...

centos下整合PagerDuty、nagios初探(on-call尝鲜和体验)

[前言] 今天在某个群里看见有人介绍了PagerDuty,介绍到了slack.整合后可以更加方便和团队合作.于是我觉得来尝尝鲜. [PagerDuty是什么?] PagerDuty是一款能够在服务器出 ...

(基础篇)php中理解print EOT分界符和echo EOT的用法区别

html与php编写中echo可以同时输出多个字符串,并不需要圆括号. print只可以同时输出一个字符串,需要圆括号. print的用法和C语言很像,所以会对输出内容里的%做特殊解释. echo无返 ...

kFreeBSD当前可以做的和不能做的

可以进行FAMP FreeBSD.Apache/Nginx.Mysql/PostGreSQL.PHP/Perl/Python 虚拟化 最易用的VirtualBox 无法安装 Java OpenJDK及 ...

浅谈WPF页间导航

浅谈WPF页间导航 使用导航的目的是从一个页面进入到另一个页面.无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有3种方法实现:调用Naviga ...

jquery的ajax同步和异步

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去 ...

JS 中 this 关键字详解

本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/call方法来调 ...

python数据结构之树和二叉树&lpar;先序遍历、中序遍历和后序遍历&rpar;

python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...

Linux指令--ifconfig

许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

jQuery EasyUI 折叠面板accordion的使用实例

1.对折叠面板区域 div 设置 class=”easyui-accordion” 2.在区域添加多个 div, 每个 div 就是一个面板 (每个面板一定要设置 title 属性). 3.设置面板属 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值