首页 >算法实例 >c语言哈希算法实例

c语言哈希算法实例

来源:www.minaka66.net 时间:2024-04-05 02:53:56 作者:在心算法网 浏览: [手机版]

  哈希算法是一常用的数据结构,它是一将任意长度的消息压缩到固定长度的消息要的函数在~心~算~法~网。哈希算法常用的应用是数据加密和数据完整性校验。在计算机科学中,哈希算法是一将任意长度的数据固定长度数据的函数,这个射的值称哈希值,哈希值通常用于数据的索引和查找。

  C语言中,哈希算法的实现主要:开放地址法和链地址法原文www.minaka66.net。开放地址法是指哈希函数产生冲突时,继续寻找下一个空的地址,直到找到一个空的地址止。链地址法是指哈希函数产生冲突时,将数据存放在链表中,这样即使冲突也不会影响其他数据的存储。

  下面我们来看一下C语言中哈希算法的实现:

c语言哈希算法实例(1)

一、开放地址法

  开放地址法是一比较简单的哈希算法,其实现步骤如下:

  1.定义一个哈希表数组,数组的大小n在.心.算.法.网

  2.对于每一个要存储的数据,计算其哈希值,然后将其存储在哈希表中。

3.如果发生冲突,就继续寻找下一个空的地址,直到找到一个空的地址止。

  4.如果哈希表已经满,就需要进行扩容操作在.心.算.法.网

下面是一个简单的开放地址法的实现:

  ```c

  #include

  #include

#include

  #define MAX_SIZE 100

typedef struct {

  char key[20];

  int value;

} HashNode;

typedef struct {

  HashNode *nodes;

int size;

int count;

} HashTable;

HashTable *createHashTable(int size) {

  HashTable *table = (HashTable *) malloc(sizeof(HashTable));

  table->size = size;

table->count = 0;

  table->nodes = (HashNode *) malloc(sizeof(HashNode) * size);

  for (int i = 0; i < size; i++) {

strcpy(table->nodes[i].key, "");

  table->nodes[i].value = -1;

  }

  return table;

}

  void destroyHashTable(HashTable *table) {

  free(table->nodes);

  free(table);

}

int hash(HashTable *table, char *key) {

int hash = 0;

for (int i = 0; i < strlen(key); i++) {

  hash = (hash << 5) + key[i];

  }

  return hash % table->size;

  }

void put(HashTable *table, char *key, int value) {

int index = hash(table, key);

  while (strcmp(table->nodes[index].key, "") != 0) {

  if (strcmp(table->nodes[index].key, key) == 0) {

  table->nodes[index].value = value;

  return;

  }

  index = (index + 1) % table->size;

  }

  strcpy(table->nodes[index].key, key);

  table->nodes[index].value = value;

  table->count++;

  }

int get(HashTable *table, char *key) {

int index = hash(table, key);

  while (strcmp(table->nodes[index].key, "") != 0) {

if (strcmp(table->nodes[index].key, key) == 0) {

  return table->nodes[index].value;

}

  index = (index + 1) % table->size;

  }

return -1;

  }

int main() {

  HashTable *table = createHashTable(MAX_SIZE);

  put(table, "apple", 1);

  put(table, "banana", 2);

  put(table, "orange", 3);

printf("apple: %d\n", get(table, "apple"));

  printf("banana: %d\n", get(table, "banana"));

  printf("orange: %d\n", get(table, "orange"));

  destroyHashTable(table);

  return 0;

  }

  ```

、链地址法

地址法是一比较常用的哈希算法,其实现步骤如下:

  1.定义一个哈希表数组,数组的大小n。

  2.对于每一个要存储的数据,计算其哈希值,然后将其存储在哈希表中。

  3.如果发生冲突,就将数据存放在链表中,这样即使冲突也不会影响其他数据的存储minaka66.net

  4.如果哈希表已经满,就需要进行扩容操作。

  下面是一个简单的链地址法的实现:

```c

  #include

  #include

#include

  #define MAX_SIZE 100

  typedef struct _HashNode {

  char key[20];

  int value;

  struct _HashNode *next;

  } HashNode;

  typedef struct {

  HashNode **nodes;

int size;

  int count;

  } HashTable;

  HashTable *createHashTable(int size) {

  HashTable *table = (HashTable *) malloc(sizeof(HashTable));

table->size = size;

  table->count = 0;

table->nodes = (HashNode **) malloc(sizeof(HashNode *) * size);

  for (int i = 0; i < size; i++) {

table->nodes[i] = NULL;

  }

  return table;

  }

  void destroyHashTable(HashTable *table) {

  for (int i = 0; i size; i++) {

HashNode *node = table->nodes[i];

  while (node != NULL) {

  HashNode *temp = node;

  node = node->next;

free(temp);

  }

  }

  free(table->nodes);

free(table);

}

  int hash(HashTable *table, char *key) {

  int hash = 0;

for (int i = 0; i < strlen(key); i++) {

hash = (hash << 5) + key[i];

  }

return hash % table->size;

  }

void put(HashTable *table, char *key, int value) {

  int index = hash(table, key);

  HashNode *node = table->nodes[index];

while (node != NULL) {

  if (strcmp(node->key, key) == 0) {

  node->value = value;

  return;

  }

node = node->next;

  }

  HashNode *newNode = (HashNode *) malloc(sizeof(HashNode));

  strcpy(newNode->key, key);

  newNode->value = value;

  newNode->next = table->nodes[index];

  table->nodes[index] = newNode;

  table->count++;

}

  int get(HashTable *table, char *key) {

  int index = hash(table, key);

  HashNode *node = table->nodes[index];

while (node != NULL) {

if (strcmp(node->key, key) == 0) {

  return node->value;

}

  node = node->next;

  }

  return -1;

  }

int main() {

  HashTable *table = createHashTable(MAX_SIZE);

put(table, "apple", 1);

  put(table, "banana", 2);

  put(table, "orange", 3);

printf("apple: %d\n", get(table, "apple"));

printf("banana: %d\n", get(table, "banana"));

  printf("orange: %d\n", get(table, "orange"));

  destroyHashTable(table);

  return 0;

}

  ```

  总结:

  哈希算法是一常用的数据结构,它可以将任意长度的数据固定长度数据,通常用于数据的索引和查找。C语言中,哈希算法的实现主要:开放地址法和链地址法在 心 算 法 网。开放地址法是指哈希函数产生冲突时,继续寻找下一个空的地址,直到找到一个空的地址止。链地址法是指哈希函数产生冲突时,将数据存放在链表中,这样即使冲突也不会影响其他数据的存储。

0% (0)
0% (0)
版权声明:《c语言哈希算法实例》一文由在心算法网(www.minaka66.net)网友投稿,不代表本站观点,版权归原作者本人所有,转载请注明出处,如有侵权、虚假信息、错误信息或任何问题,请尽快与我们联系,我们将第一时间处理!

我要评论

评论 ( 0 条评论)
网友评论仅供其表达个人看法,并不表明好好孕立场。
最新评论

还没有评论,快来做评论第一人吧!
相关文章
  • 生活算法实例:如何提高自己的学习效率

    在现代社会中,学习已经成为了每个人必须面对的任务。无论是在学校还是在工作中,学习都是不可避免的。但是,如何提高自己的学习效率却是一个值得思考和探讨的问题。下面,我们将分享一些生活算法实例,帮助大家提高学习效率。1. 制定明确的学习计划

    [ 2024-04-04 15:55:00 ]
  • lda算法代码实例_如何提高英语口语水平?

    英语口语是许多人学习英语的最终目标,但是很多人在学习过程中却遇到了很多困难。本文将介绍一些提高英语口语水平的方法,帮助你更快地达到目标。一、多听多说学习英语口语最基本的方法就是多听多说。听英语广播、看英语电影、听英语歌曲等等,都是非常有效的方法。在听的同时,可以模仿英语母语者的发音和语调,让自己的口语更加地自然。

    [ 2024-04-04 04:06:07 ]
  • 计算机视觉模型算法实例:从图像识别到目标检测

    引言计算机视觉是指通过计算机技术实现对图像、视频等视觉信息的处理与分析。随着计算机技术的不断发展,计算机视觉在人工智能领域中扮演着越来越重要的角色。本文将介绍计算机视觉模型算法的基本概念、主要应用以及实例分析。计算机视觉模型算法基本概念

    [ 2024-04-01 23:09:24 ]
  • 身边的算法生活实例分析

    随着科技的不断发展,算法已经渗透到我们生活的方方面面。从搜索引擎到社交媒体,从智能家居到自动驾驶,算法在我们的生活中扮演着越来越重要的角色。在本文中,我将以几个身边的算法生活实例为例,探讨算法在我们生活中的应用。搜索引擎算法搜索引擎算法是我们日常生活中最常见的算法之一。每当我们在搜索引擎中输入关键词时,搜索引擎都会根据一定的算法来返回相关的搜索结果。

    [ 2024-03-30 04:37:09 ]
  • 蚁群算法在建筑设计中的应用

    随着科技的不断发展,人们对建筑的要求也越来越高。如何在保证建筑安全、美观、实用的前提下,尽可能地降低成本,成为了建筑设计中的重要问题。而蚁群算法作为一种新兴的优化算法,已经被广泛应用于建筑设计中。本文将介绍蚁群算法在建筑设计中的应用,并以一座办公楼的设计为例进行说明。蚁群算法的基本原理

    [ 2024-03-28 10:05:10 ]
  • Orlin算法:线性规划中的重要工具

    在线性规划中,我们通常需要找到一组最优解,以满足一系列约束条件。然而,线性规划问题往往非常复杂,需要耗费大量时间和计算资源才能得到最优解。为了解决这个问题,Orlin算法应运而生。Orlin算法是一种常用的线性规划求解算法,它的主要思想是基于网络流理论,将线性规划问题转化为最小割问题。

    [ 2024-03-28 04:27:04 ]
  • EOQ算法实例:如何优化库存管理

    什么是EOQ算法EOQ算法(Economic Order Quantity)是一种用于计算最优库存量的数学模型。该算法的目的是通过平衡库存成本和缺货成本,确定最佳的订单量和补货时间,以最大程度地减少库存成本和缺货成本之和。EOQ算法的应用

    [ 2024-03-24 07:41:07 ]
  • 基于LMS算法的语音信号降噪仿真

    随着科技的不断发展,语音信号处理技术也得到了广泛的应用。在实际应用中,由于各种原因,语音信号可能会受到噪声的干扰,导致信号质量下降。因此,对于语音信号的降噪处理显得尤为重要。本文将介绍一种基于LMS算法的语音信号降噪方法,并通过仿真实验验证其效果。一、LMS算法简介

    [ 2024-03-24 02:40:58 ]
  • 佛洛依德算法:探究人类内心深处的秘密

    佛洛依德算法,又称为弗洛伊德算法,是一种用于解决图形最短路径问题的算法。它的核心思想是通过不断地寻找当前节点到目标节点的最短路径,并将这个最短路径不断地扩展,最终找到整个图形的最短路径。但是,佛洛依德算法不仅仅只是一个用于解决图形问题的算法,它还有着更为深刻的内涵。

    [ 2024-03-13 19:06:14 ]
  • 如何提高自己的学习效率(用计算法确定加工余量实例)

    随着社会的不断发展,学习已经成为每个人必须面对的问题。然而,面对繁重的学业和工作任务,我们常常感到无从下手,学习效率也不高。那么,如何提高自己的学习效率呢?一、制定合理的学习计划制定合理的学习计划是提高学习效率的关键。首先,要根据自己的时间和能力制定目标,把任务分解成小步骤,逐步完成。其次,要合理安排学习时间,充分利用碎片时间,避免拖延症的发生。

    [ 2024-03-13 10:07:40 ]