哈希表的实现 何为哈希表 简单来说,哈希表是一种存储结构,它存储的数据是 key:value 类型的。通过空间换时间的方法来加快查询速度,具体思想是如下: 使用一个较大的一维数组存储value,这个数组为Array 实现一个哈希函数,使得hash(key)的值在上一步的一维数组下标范围内 如此,对于任意的key:value,使用hash(key),之后就可以知道value在数组中存储的下标,存取速度快过线性查找Array[hash(key)] 哈希表的注意要点 哈希函数的选取 由于我们期望,两个不同的key,hash(key)之后的结果尽量不相同,这样才能使得哈希表存储空间的利用率提高,另一点,哈希表的空间换时间的主要原因就是他使用了哈希函数来确定value在数组中的下标而非普通的线性查找。那么,基于以上两点,哈希函数的选取就有以下条件: hash函数运行速度不能过慢 对于不同的key(即便两个key只是字母顺序不一致),哈希函数须尽量保证hash(key)的值不一致 处理哈希碰撞 由于是无论k 继续阅读 >>


李余通 18/10/09 20:17:14
根据我上一片博客的介绍–c++函数模板初探 我们可以用模板实现很多函数,也对c++函数模板有了初步的了解。 但是加入有下面这个情况: template <class T1, class T2> void ft (T1 &x, T2 &y) { ... ?type? xpy = x+; ... } 在这种情况下xpy应该是什么类型呢?由于不知道ft()将如何使用,因此无法预知这一点。正确的类型可能是T1、T2或者其他类型。假如又出现了重载运算符,这会让问题更加的复杂。 于是为了解决这个问题,c++11新增了关键字 decltype。 我们可以这样使用: int x; decltype(x) y;//y的类型和x类型一致 除了上述这样写,我们也可以这样写: decltype(x+y) xpy; xpy = x+y; 通过这个关键字,我们可以把前面的代码修改成这样: template <class T1, class T2> void ft(T1 x, T 继续阅读 >>


陈苏扬 18/10/04 07:40:50
注:本篇博客主要内容来源于网络,侵删~ 引言 我们假设你已经熟练掌握了CAS,原子变量类等的相关概念。这篇博客中,我们主要讨论原子变量类的使用。 原子变量类 原子变量类共12个,分4组: 计数器:AtomicInteger,AtomicLong,AtomicBoolean,AtomicReference。 域更新器:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater。 数组:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。 复合变量:AtomicMarkableReference,AtomicStampedReference。 在每组中我会选择其中一个较有代表性的进行分析与举例。 AtomicReference 使用说明 AtomicReference的作用是对"对象"进行原子操作。 源码分析 public class AtomicR 继续阅读 >>


董恒毅 18/10/03 13:51:16
C++之所以强大,其中肯定少不了模板的功劳。使用好模板也可以为以后的编程省去很多的功夫。 函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中泛型可用具体的类型(如int或double) 替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。由于模板允许以泛型的方式编写程序,因此有时也被称为通用编程。由于类型使用参数表示的,因此模板特性有时也被成为参数化类型(parameterized types) (C++ Primer Plus 第六版中文 P281) 以上就是一个函数模板的定义。 首先如果没有函数模板, 试想如果需要一个函数来交换两个数字的值,这个时候由于不知道两个数字的类型,你需要使用函数重载来写很多个类型的函数,如 void Swap(int &, int &); void Swap(double &, double &); void Swap(char &, char &); void Swap(short &am 继续阅读 >>


陈苏扬 18/10/03 10:10:56
文章目录创建线程std::thread 类使用join()使用 detach()警惕作用域线程不能复制给线程传参传递指针传递引用以类成员函数为线程函数以容器存放线程对象互斥量std::mutexstd::lock_guard条件变量call_once 创建线程 C++11 增加了线程以及线程相关的类, 而之前并没有对并发编程提供语言级别的支持 std::thread 类 使用 std::thread 类来创建线程, 我们需要提供的只是线程函数, 或者线程对象, 同时提供必要的参数 std::thread 表示单个执行的线程, 使用thread 类首先会构造一个线程对象, 然后开始执行线程函数, #include <iostream> #include <thread> //需要包含的头 using namespace std; void func(int a, double b) //有参数, 参数数量不限 { cout << a << ' 继续阅读 >>


吕子健 18/09/30 16:27:30
1. 为新线程传递参数 错误代码示例: for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, &i); } 当当当,要提问啦!!! 以上这段代码会发生什么奇怪的事情吗?当线程去进行处理i的时候,如果cpu调度到主线程运行,就会改变i的值。因为传入的是地址,所以线程中使用的i就会被改变。这就会出现问题。那么我们如何给线程传递参数呐?一般有以下两种方法: 1. 传送值而不传送地址 2. 通过`new,malloc`传递 1. 传送值而不传送地址 for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, (void *)i); } void *handle(void *arg) { int i = (int)arg; 。。。 retur 继续阅读 >>


刘生玺 18/09/27 23:41:07
注:本篇博客部分内容引用自:Java并发编程:Lock 引言 在Java 5.0之前,协调对共享对象的访问可以使用到的机制只有synchronized和volatile。在Java 5.0之后,增加了一种新的机制:ReentrantLock。ReentrantLock并不是一种替代内置锁的方法,而是在内置锁不再适用的情况下,作为一种可选择的高级功能。 既生synchronized,何生Lock synchronized主要在功能上存在一些局限性。 如果获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。 再举个例子:当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。 如果采用synchronized关键字来实现 继续阅读 >>


董恒毅 18/09/27 15:46:50
最近由于工作需要,要从hbase中读取数据,然后处理过后,展示给用户,在网上搜通过Python的happybase模块可以进行简单快捷的读取,但是在安装happybase,让我非常不开心,具体错误如下: Collecting happybase Using cached https://files.pythonhosted.org/packages/8d/a4/9c1202ad4276d4e845594d534397c07082b90aee68c67f378fac38629e6f/happybase-1.1.0.tar.gz Requirement already satisfied: six in /usr/local/Python37/lib/python3.7/site-packages (from happybase) (1.11.0) Collecting thriftpy>=0.3.8 (from happybase) Using cached https://files.py 继续阅读 >>


周攀 18/09/27 08:27:17
   首先,如果你还不了解什么是带外数据:点这里 心跳机制的产生就是为了检测出对端主机或到对端的通信路径是否过早失效。 注意:在使用心跳机制时,你应该考虑是不是符合你所处的情景,确定在对端应答的时间超过 5~10s 之后终止连接是件好事还是坏事。如果你的产品需要实时的知道对端的“生存状态”,(要么是为了需求,要么是为了节省资源)那么就是需要这种机制的。一般用于 长连接 。    在这里,我们使用TCP的带外数据来完成心跳机制的实现(每秒钟轮询一次,若5秒没有得到响应就认为对端已经“死亡”),实现如下所示 : 客户端每隔1秒钟向服务器发送一个带外字节,服务器收到该类型的字节然后再发送回一个带外字节。因为每一端都需要对端不复存在或者不再可达。需要指出的是:**数据,回送数据和带外字节都通过单个的连接交换的 。**代码实现如下,具体实现细节在代码中有注释指出 Recvline 函数 #include "../myhead.h" static int recv_cnt = 0; static char 继续阅读 >>


刘生玺 18/09/23 15:31:39
ArchLinux 安装及KDE桌面环境安装配置 首先,安装之前,需要一个“启动介质”,我这里习惯使用USB设备作为启动介质,这是由于ArchLinux滚动更新的特性,而且占用空间很小,以其他的方式安装个人认为不太适合。 话不多说,访问ArchLinux官方网站,点击右上角Download,在下方选择适合你的下载方式或镜像进行下载,我常用的地址是网易的镜像源,和清华大学的镜像源。下载完毕后,我一般使用开源工具Rufus将之写入到U盘中。 安装 将启动U盘插入到电脑中,选择从U盘启动,进入到archlinux的LiveCD模式,若使用网线连接,此时应已经自动配置好网络,可使用ping命令测试网络;若使用无线网络,则键入wifi-menu命令选择并登录无线网络。然后,输入以下命令保证系统时间是正确的: timedatectl set-ntp true 然后我们可以通过fdisk -l命令查看分区情况,若要在此时修改分区表,ArchLinux提供了命令parted和fdisk,可以在此时修改分区表。若要格式 继续阅读 >>


娄泽豪 18/09/22 22:22:39