数据结构和算法
文章平均质量分 72
炼气散人
等儿子高考后,或许会回来
展开
-
Java HashMap 分析之一:基本结构
Java的HashMap非常的常用,本篇研究它的实现算法,最后希望计算出内存占用,性能的量化数据,然后得出什么时候使用HashMap,什么时候不能滥用的结论。HashMap实际上是一个数组,数组里面的每个元素都是一个链表。每个元素在通过put方法放入HashMap中的时候,要按照如下步骤进行:1.根据该元素自身提供的hashcode计算出散列值,该散列值就是数组的下标2.将新元素放入该数组位置的链原创 2012-03-12 23:56:17 · 10135 阅读 · 4 评论 -
C++14整数最大/小值
Table of Contents1. 如何获取最大值1.1. C++14的方法1.2. 如何自己实现最大值1.3. 如何自己实现最小值1 如何获取最大值1.1 C++14的方法std::cout << "int\t" ::lowest() << '\t' ::max() << '\n';输出结果为:int -2147483648 21474836471.2 如何自己实现最大值int原创 2016-01-14 10:39:44 · 3177 阅读 · 1 评论 -
Java HashMap 分析之三:放入元素
现在,有了hash code,来考虑如何计算放入数组的位置。hash code值通常会很大,但是数组的大小有限,默认只有16,大的也不能超过2的30次方。所以,用模运算来保证在数组大小范围内是合理的,比如:index = hash code % array size.不过这有点慢,JDK采用了更快的算法。这个更快的算法源于一个数学规律,就是如果size是2的N次方,那么数X对size的模运算结原创 2012-03-15 00:12:14 · 14573 阅读 · 17 评论 -
字节数组转成16进制表示
网络程序经常要比对收到的数据,用16进制字符串表示比较容易。下面是代码:string PrintByteArrayAsHexString(vector const& v) { stringstream stream; stream << std::hex << std::uppercase << std::setfill('0'); size_t size = v.size();原创 2013-04-23 22:25:02 · 4936 阅读 · 0 评论 -
字节顺序
endian就是字节顺序的意思big-endian现在在纸上书写阿拉伯数字198,我们肯定是先写最高位1,直到写到最低位8,如果让计算机采用这个顺序存放数据到内存中,也就是先在低位起始地址放最高位1,然后写上9,最后是8.这样的顺序就是big endian.little-endian与其顺序相反的是,低位地址存放低位数字,高位地址存放高位数字。这种最合乎计算机内存地址的写法就是little end原创 2012-06-02 14:51:15 · 5827 阅读 · 8 评论 -
10进制数转二进制表示
之前写了一篇文章,描述如何用bitset来表达计算机中存储的int变量的实际二进制布局,在工作中非常有用。本篇是用算法自己实现10进制整数转换成二进制数。逻辑上,如果将10进制数5用一个字节表示,应该是101,你可以通过000开始不断加1,得到这个数。但是实际上一般都采用除法计算。5 / 2 得到商为 2 余数为1用商2 / 2, 得到商为1 余数为0用商1 / 2 得到商为0 余数原创 2013-01-19 11:47:33 · 4791 阅读 · 2 评论 -
深入理解按位异或运算符
http://kapok.blog.51cto.com/517862/129941转载 2012-12-24 15:11:14 · 2774 阅读 · 0 评论 -
算术移位和逻辑移位
术语arithmetic shift 算术移位logical shift 逻辑移位区别移位后空缺的如何补充?TypeLeft ShiftRight ShiftArithmetic Shift补0补符号位Logical Shift补0补0原创 2012-06-28 22:03:47 · 4986 阅读 · 1 评论 -
N叉树一 基本实现
丢了一次以前写的算法的文档和源代码,Ubuntu One不可靠啊!只好从头再写一遍。本文实现了一个树,不是二叉树,是N叉树。也就是允许一个节点拥有多个子节点。不是为了做题目糊弄人,所以内存管理不允许泄漏,用了C++11的shared_ptr。先看看调用代码:#include #include using namespace std;#include "tree.h"using name原创 2012-06-03 20:16:49 · 4984 阅读 · 0 评论 -
整数的二进制显示
由于C++没有方便的直接显示整数二进制的函数。这里简单写了一个,希望这个工具对大家观察计算机中二进制的补码表示以及位运算有帮助。代码还是用到了bitset做帮助,不过便于查看添加了每个字节之间的空格。算法控们可以不采用bitset,自己实现一个。这里显示的都是补码,至于补码的规则,参考:http://blog.csdn.net/sheismylife/article/details/7626219原创 2012-06-02 11:00:43 · 5897 阅读 · 0 评论 -
Java HashMap 分析之四:查找和内存使用
获取元素有了前面的分析,获取元素的逻辑就非常清晰。首先,调用者传递key,从key的hashCode方法获得值后,调用hash函数做一些低位置换,保证hash值的均匀分布,之后和size-1按位与后得到数组的位置。然后取出对应位置的链表,遍历该链表,查找hash值相等,并且key的引用或者值相等的对象,然后返回。代码见下面: public V get(Object key) {原创 2012-03-15 23:18:39 · 20293 阅读 · 14 评论 -
Java HashMap 分析之二:Hash code
散列计算就是计算元素应该放在数组的哪个元素里。准确的说是放到哪个链表里面。按照Java的规则,如果你要想将一个对象放入HashMap中,你的对象的类必须提供hashcode方法,返回一个整数值。比如String类就有如下方法:public int hashCode() { int h = hash; int len = count; if (h ==原创 2012-03-13 23:00:17 · 9187 阅读 · 0 评论 -
原码,反码和补码
原码 true code原码很简单,一个10进制正数通过除2法转换成的2进制数就是原码。比如8的原码是:1000反码 complement,bitwise NOT也很简单,就是翻转每个bit。比如:NOT 0111 (decimal 7) = 1000 (decimal 8)C/C++语言中,用~运算符就可以得到反码。One's complement这是一种对有符号整数的计算机内部二进制表原创 2012-06-02 21:24:20 · 4120 阅读 · 1 评论