XOR双向链表
这是一个数据结构。利用计算机的的位异或操作(⊕),来降低双向链表的存储需求。
... A B C D E ...
–> next –> next –> next –>
<– prev <– prev <– prev <–
双向链表如上面所示,每个节点有两个指针,分别指向该节点的前驱和后继。
而XOR链表如下面所示:An XOR linked list compresses the same information into one address field by storing the bitwise XOR of the address for previous and the address for next in one field:
... A B C D E ...
<–> A⊕C <-> B⊕D <-> C⊕E <->
link(B) = addr(A)⊕addr(C), link(C) = addr(B)⊕addr(D), ..
要求addr(D),使用:addr(D) = link(C) ⊕ addr(B)
地址指针中存放的地址的异或。 比如B中就存放了A⊕C的值。
这样从头开始便利时,我们需要知道开始的两个节点(而不像普通链表只需要一个)。
这样比如知道了节点A和节点B 我们就可以用节点A的地址和B中的A⊕C 结合运算,得到A⊕A⊕C 得到C。 这是正向遍历
反向遍历时类似,比如知道了节点E和D,就可以利用E的地址和D中的C⊕E 运算,得到C⊕E⊕E 得到C.
To start traversing the list in either direction from some point, you need the address of two consecutive items, not just one. If the addresses of the two consecutive items are reversed, you will end up traversing the list in the opposite direction.
This form of linked list may be inadvisable: 异或链表不推荐使用:
- General-purpose debugging tools cannot follow the XOR chain, making debugging more difficult; [1]
- The price for the decrease in memory usage is an increase in code complexity, making maintenance more expensive; 虽然内存使用减少了,但代码复杂量增加了,使维护更加昂贵。
- Most garbage collection schemes do not work with data structures that do not contain literal pointers;通常的垃圾回收机制对于这种表示无法正常工作
- XOR of pointers is not defined in some contexts (e.g., the C language), although many languages provide some kind of type conversion between pointers and integers;
- The pointers will be unreadable if one isn't traversing the list — for example, if the pointer to a list item was contained in another data structure;不是在遍历链表时,指针是无意义的。例如另外的数据结构也包含了链表中的指针。
- While traversing the list you need to remember the address of the previously accessed node in order to calculate the next node's address.
- XOR linked lists do not provide some of the important advantages of doubly-linked lists, such as the ability to delete a node from the list knowing only its address or the ability to insert a new node before or after an existing node when knowing only the address of the existing node.XOR链表也无法提供双向链表提供的一些功能。比如仅知道一个节点是将该节点从链表移除或者在仅知道一个节点时再该节点后面插入一个节点。
Computer systems have increasingly cheap and plentiful memory, and storage overhead is not generally an overriding issue outside specialized embedded systems. Where it is still desirable to reduce the overhead of a linked list, unrolling provides a more practical approach (as well as other advantages, such as increasing cache performance and speeding random access).
实现代码:http://blog.wsensors.com/2011/04/the-xor-linked-list-in-c/
类似的变形
加法链表:放地址的和
... A B C D E ...
<–> A+C <-> B+D <-> C+E <->
减法链表:放地址的差
... A B C D E ...
<–> C-A <-> D-B <-> E-C <->
不同是正向和反向需要做不同的运算。 参考:http://en.wikipedia.org/wiki/XOR_linked_list
XOR双向链表的更多相关文章
- 异或链表(XOR linked list)
异或链表(Xor Linked List)也是一种链式存储结构,它可以降低空间复杂度达到和双向链表一样目的,任何一个节点可以方便的访问它的前驱节点和后继结点.可以参阅wiki 普通的双向链表 clas ...
- CLRS10.2-8练习 - 单指针值实现双向链表
要求: Explain how to implement doubly linked lists using only one pointer value x.np peritem instead o ...
- XOR linked list--- 异或链表
异或链表的结构 这是一个数据结构.利用计算机的的位异或操作(⊕),来降低双向链表的存储需求. ... A B C D E ... –> next –> next –> next –& ...
- 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- 二分+DP+Trie HDOJ 5715 XOR 游戏
题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- BZOJ 2115 【Wc2011】 Xor
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
随机推荐
- 商品列表中显示类别名称而不是类别ID
商品表中的字段包裹商品信息和categoryid 若要在商品列表中显示出categoryname,有两种做法: 第一种做法: 拿到categoryid后再跟数据库连接一下,然后拿出categoryna ...
- Spring发送电子邮件
Spring提供了发送电子邮件的功能,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理. Spring的邮件服务支持主要是通过JavaMailSender这个接口实现的: p ...
- gulp api
gulp api 简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 gulp是基于Nod ...
- opennebula auth module ldap
1,安装net-ldap addon ruby library for openldap
- linux下主要是VirtualBox及GuestAdditions的安装
Linux版本的VirtualBox下载:http://www.virtualbox.org/wiki/Linux_Downloads.请下载对应的版本. RedHat.RHEL:rpm -i vh ...
- 全国计算机等级考试二级教程-C语言程序设计_第15章_位运算
位运算,不适用于实数,仅仅适用于整数.字符. C语言的位运算只能操作整数.字符,实数是指数方式表示的,不适用于位运算. #define _CRT_SECURE_NO_WARNINGS #include ...
- hdu 4597 Play Game(区间dp,记忆化搜索)
Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...
- javascript第三课underfind和类型获取
1.underfind一般发生于变量定义之后未赋值,因此变量的值就为underfind 2.var obj=new object(); 此时使用obj点,可以获取到obj对象的一些方法,使用alert ...
- UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
1. ckfinder(ckfinder插件标签) 1.1. 參数 属性名 类型 描写叙述 是否必须 默认值 name string 属性名称 是 null value string 默认值 否 nu ...
- PHP语言基础06 MySql By ACReaper
上篇介绍了如用PHP连接上MySql进行,并进行sql语句的执行.但是我们没有介绍,如何输出处理的结果,如何获得处理的结果. 这里要先说明Mysql有两种查询处理模式,一种是有缓冲的查询处理模式,一种 ...