哈希表的简单操作

哈希表中,关键值通过哈希函数映射到数组上,查找时通过关键值直接访问数组。哈希表的关键问题在于哈希函数的构造和解决冲突的方法。

下面采用最简单的线性探测展示一下哈希表的基本操作:

  1 //Hashtable
  2 class HashTable {
  3 private:
  4     string *elem;
  5     int size;
  6 public:
  7     HashTable() {
  8         size = 2000;
  9         elem = new string[size];
 10         for (int i = 0; i < size; i++) {
 11             // "#" means that this slot is empty
 12             elem[i] = "#";
 13         }
 14     }
 15     ~HashTable() {
 16         delete[] elem;
 17     }
 18
 19     // get hash code of a string
 20     int hash(string &value) {
 21         int code = 0;
 22         for (size_t i = 0; i < value.length(); i++) {
 23             code = (code * 256 + value[i] + 128) % size;
 24         }
 25         return code;
 26     }
 27
 28     //search for an element
 29     //here pos and times are reference,
 30     //so in the end pos will be set to the pos of the target and times and how many slots you have tried
 31     bool search(string &value, int &pos, int &times) {
 32         pos = hash(value);
 33         times = 0;
 34         while (elem[pos] != "#" && elem[pos] != value) {
 35             times++;
 36             if (times < size) {
 37                 //test for next slot
 38                 pos = (pos + 1) % size;
 39             } else {
 40                 return false;
 41             }
 42         }
 43         if (elem[pos] == value) {
 44             return true;
 45         } else {
 46             //the slot is vacant
 47             return false;
 48         }
 49     }
 50
 51     int insert(string &value) {
 52         int pos, times;
 53         if (search(value, pos, times)) {
 54             //the elem already exists
 55             return 2;
 56         } else if (times < size / 2) {
 57             elem[pos] = value;
 58             return 1;
 59         } else {
 60             //the hashtable is too packed, need to expand and make it sparse
 61             recreate();
 62             insert(value);
 63             return 0;
 64         }
 65     }
 66
 67     void recreate(){
 68         string *temp_elem;
 69         temp_elem=new string[size];
 70         for(int i=0;i<size;i++){
 71             temp_elem[i]=elem[i];
 72         }
 73         int copy_size=size;
 74         size=size*2;
 75         delete[] elem;
 76         elem=new string[size];
 77         for(int i=0;i<size;i++){
 78             elem[i]="#";
 79         }
 80         for(int i=0;i<copy_size;i++){
 81             if(temp_elem[i]!="#"){
 82                 insert(temp_elem[i]);
 83             }
 84         }
 85         delete[] temp_elem;
 86     }
 87 };
 88
 89 int main() {
 90     HashTable hashtable;
 91     string buffer;
 92     int n;
 93     cin >> n;
 94     for (int i = 1; i <= n; i++) {
 95         cin >> buffer;
 96         int ans = hashtable.insert(buffer);
 97         if (ans == 0) {
 98             cout << "recreate while insert!" << endl;
 99         } else if (ans == 1) {
100             cout << "insert success!" << endl;
101         } else if (ans == 2) {
102             cout << "It already exists!" << endl;
103         }
104     }
105     int temp_pos, temp_times;
106     cin >> buffer;
107     if (hashtable.search(buffer, temp_pos, temp_times)) {
108         cout << "search success!" << endl;
109     } else {
110         cout << "search failed!" << endl;
111     }
112     return 0;
113 }
时间: 2024-12-22 07:24:28

哈希表的简单操作的相关文章

哈希表的简单实现

下面这个散列表的实现来自K&R,很经典.在其他场景中遇到的实现更复杂,基本原理不变,只是在hash算法,或者在快速查询上做了优化. #include <stdio.h> #include <stdlib.h> //具有相同hash值构成的链表 struct nlist{ struct nlist * next; char * name;  //key-定义的名字 char * defn;  //value-替换文本 }; #define HASHSIZE 101  //桶的

SQL Server 的表数据简单操作(表数据查询)

--表数据查询----数据的基本查询-- --数据简单的查询--select * | 字段名[,字段名2, ...] from 数据表名 [where 条件表达式] 例:use 商品管理数据库goselect * from 商品信息表select 商品编号,商品名称,产地 from 商品信息表selelct * from 商品信息表 where 产地='辽宁沈阳' --关键字辅助查询----1)distinct关键字 (用来消除查询结果中的重复行,使用时紧跟在select命令后)--select

SQL表的简单操作

创建数据库表,进行增删改查是我们操作数据库的最基础的操作,很简单,熟悉的请关闭,免得让费时间. 1.创建表: sql中创建数值类型字段要根据该字段值的增长情况选择类型: tinyint 占1个字节,长度为 0-255 smallint 占2个字节,长度为 2^15 (-32,768) 到 2^15-1 (32,767) int 占4个字节,长度为 -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647) bigint 占8个字节,长度为 -2^63 (-9,

SQL Server 的表数据简单操作

--表数据操作----添加表数据----向现有表添加数据--[use 要操作数据表的数据库名称go]insert [into] 数据表 [(字段名1,字段名2,字段名3, ...)] values(值1,值2,值3, ...) 例:use 商品管理数据库goinsert 客户信息表(客户姓名,客户编号,联系电话)values('刘培群','021','13927112594') --把查询到的表数据生成(添加到)一张新数据表--[use 要操作数据表的数据库名称go]select 字段名列表 i

mysql建立表及表的简单操作-插入数据-删除主键-删除表-修改表的数据-删除表的数据

-- 1.使用数据库 USE ren; -- 2.建立student表 CREATE TABLE student ( sid INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,   -- UNSIGNED(无符号) AUTO_INCREMENT(自增) sname VARCHAR(10),    -- 只能保存10个字符 saddress VARCHAR(15)   -- 只能保存15个字符 )ENGINE=MYISAM DEFAULT CHARSET=utf8;

mysql数据库和数据表的简单操作

一.数据库的增删改查 1.新建数据库 CREATE DATABASE 数据库名 charset utf8; 数据库名规则:可以由字母.数字.下划线.@.#.$ 区分大小写, 不能使用关键字如 create select, 不能单独使用数字, 最长128位 2.查看数据库 show databases; show create database 数据库名; 3.选择数据库 USE 数据库名; 4.删除数据库 DROP DATABASE 数据库名; 5.修改数据库字符编码 alter databas

MYSQL中有关表的简单操作

#创建表 CREATE TABLE table02( tid INT, tname VARCHAR(20)); #查看所有表SHOW TABLES; #查看表的结构DESC table01; #修改表名RENAME TABLE table02 TO table002; #删除表DROP TABLE table002; 原文地址:https://www.cnblogs.com/YLTzxzy/p/10997014.html

普通集合和泛型集合的区别,哈希表和字典表的区别,队列和堆栈的区别以及堆和栈的区别。

普通集合和泛型集合的区别: 泛型集合与传统集合相比 类型更安全. 泛型集合无需装箱拆箱操作. 泛型的重要性. 泛型是未来五年的主流技术 ... 通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱. 下面的泛型类型对应于现有的集合类型: List 是对应于 ArrayList 的泛型类. Di

哈希表应用

在C#中应用哈希表(Hashtable) 2006-05-24 15:16 491人阅读 评论(0) 收藏 举报 c#stringobjectsystemclass.net 一.哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写:value用于存储对应于key的值.Hashtable中key/value