c语言实现通用数据结构:通用集合(HashSet)

【应用C】C语言实现HashSet并模仿Java机制和语法(+源代码) 文章目录01 - HashSet02 - HashCode02 - 模仿Java机制和语法2.1 - 模仿泛型2.2 - 模仿自动扩容2.3 - 模仿迭代器03 - 结果测试04 - 源码下载05 - 总结 很久之前的一个课程作业,用C语言实现HashSet,体会HashSet的内部工作机制,同时模仿Java的机制和语法 01 - HashSet   HashSet(哈希集合)是一种容器,Jav... 阅读详情

这是在通用链表的基础上实现的集合,关于链表的实现参见:http://blog.youkuaiyun.com/swwlqw/article/details/22498833。

注意集合中只存储了指针,没有储存实际的数据。

对于新的数据类型来说,需要自定义HashCode函数和equal函数。

下面还给出了几个常见的hashCode函数和equal函数。


(1)HashCode函数

头文件

[cpp]  view plain  copy
  1. /************************* 
  2. *** File myHashCode.h 
  3. **************************/  
  4. #ifndef MYHASHCODE_H_INCLUDED  
  5. #define MYHASHCODE_H_INCLUDED  
  6.   
  7. #include <string.h>  
  8.   
  9. #define HASHCODE_MULT 31  
  10.   
  11. //默认的hashCode  
  12. int myHashCodeDefault(void * a);  
  13.   
  14. //int类型hashCode  
  15. int myHashCodeInt(void * a);  
  16.   
  17. //char类型的hashCode  
  18. int myHashCodeChar(void * a);  
  19.   
  20. //string类型的hashCode  
  21. int myHashCodeString(void * a);  
  22.   
  23. #endif // MYHASHCODE_H_INCLUDED  


源文件

[cpp]  view plain  copy
  1. /************************* 
  2. *** File myHashCode.c 
  3. **************************/  
  4. #include "myHashCode.h"  
  5.   
  6. //默认的hashCode  
  7. int myHashCodeDefault(void * a)  
  8. {  
  9.     return (int) a;  
  10. }  
  11.   
  12. //int类型hashCode  
  13. int myHashCodeInt(void * a)  
  14. {  
  15.     int * aa = (int *) a;  
  16.     return *aa;  
  17. }  
  18.   
  19. //char类型的hashCode  
  20. int myHashCodeChar(void * a)  
  21. {  
  22.     char *aa = (char *) a;  
  23.     return *aa;  
  24. }  
  25.   
  26. //string类型的hashCode  
  27. int myHashCodeString(void * a)  
  28. {  
  29.     int re = 0;  
  30.     char *aa = (char *) a;  
  31.     while (*aa)  
  32.     {  
  33.         re += HASHCODE_MULT * *aa;  
  34.         aa++;  
  35.     }  
  36.     return re;  
  37. }  

(2)equal函数

头文件

[cpp]  view plain  copy
  1. /************************* 
  2. *** File myEqual.h 
  3. **************************/  
  4. #ifndef MYEQUAL_H_INCLUDED  
  5. #define MYEQUAL_H_INCLUDED  
  6.   
  7. //默认的相等的方法  
  8. int myEqualDefault(void * a, void *b);  
  9.   
  10. //int类型相等的方法  
  11. int myEqualInt(void * a, void *b);  
  12.   
  13. //char类型相等的方法  
  14. int myEqualChar(void * a, void *b);  
  15.   
  16. //string类型相等的方法  
  17. int myEqualString(void * a, void *b);  
  18.   
  19. #endif // MYEQUAL_H_INCLUDED  

源文件

[cpp]  view plain  copy
  1. /************************* 
  2. *** File myEqual.c 
  3. **************************/  
  4. #include "myEqual.h"  
  5. #include <string.h>  
  6.   
  7. //默认的相等的方法  
  8. int myEqualDefault(void * a, void *b)  
  9. {  
  10.     return a == b;  
  11. }  
  12.   
  13. //int类型相等的方法  
  14. int myEqualInt(void * a, void *b)  
  15. {  
  16.     int *aa = (int*) a;  
  17.     int *bb = (int *) b;  
  18.     return *aa == *bb;  
  19. }  
  20.   
  21. //char类型相等的方法  
  22. int myEqualChar(void * a, void *b)  
  23. {  
  24.     char *aa = (char *) a;  
  25.     char *bb = (char *) b;  
  26.     return *aa = *bb;  
  27. }  
  28.   
  29. //string类型相等的方法  
  30. int myEqualString(void * a, void *b)  
  31. {  
  32.     char *aa = (char *) a;  
  33.     char *bb = (char *) b;  
  34.     return strcmp(aa, bb)==0;  
  35. }  

(3)HashSet

头文件

[cpp]  view plain  copy
  1. #ifndef MYHASHSET_H_INCLUDED  
  2. #define MYHASHSET_H_INCLUDED  
  3.   
  4. # include "myHashMap.h"  
  5.   
  6. typedef struct myHashSet  
  7. {  
  8.     int size; //大小  
  9.     int initialCapacity; //初始容量  
  10.     float loadFactor; //加载因子  
  11.     int (*hashCode)(void *data);  
  12.     int (*equal)(void *data1, void *data2);  
  13.     MyList ** dataList;  
  14. } MyHashSet;  
  15.   
  16. typedef struct myHashSetIterator  
  17. {  
  18.     int index; //第几个链表  
  19.     MyHashSet *set;  
  20.     MyNode *current;  
  21.     int count; //第几个数据  
  22. } MyHashSetIterator;  
  23.   
  24. //创建HashSet  
  25. MyHashSet *createMyHashSet(int (*hashCode)(void *data),int (*equal)(void *data1,void *data2));  
  26.   
  27. //使用全部参数创建HashSet  
  28. MyHashSet *createMyHashSetForAll(int initialCapacity,float loadFactor,int (*hashCode)(void *data),int (*equal)(void *data1,void *data2));  
  29.   
  30. //释放HashSet  
  31. void freeMyHashSet(MyHashSet * set);  
  32.   
  33. //是否包含某个data  
  34. int myHashSetContains(MyHashSet * const set, void * const data);  
  35.   
  36. //增加一条数据,返回是否添加成功  
  37. int myHashSetAddData(MyHashSet * const set, void * const data);  
  38.   
  39. //数据的容量  
  40. int myHashSetGetSize(const MyHashSet * const set);  
  41.   
  42. //创建迭代器  
  43. MyHashSetIterator* createMyHashSetIterator(MyHashSet * const set);  
  44.   
  45. //释放迭代器  
  46. void freeMyHashSetIterator(MyHashSetIterator* iterator);  
  47.   
  48. //迭代器是否有下一个  
  49. int myHashSetIteratorHasNext(MyHashSetIterator* iterator);  
  50.   
  51. //遍历下一个元素  
  52. void* myHashSetIteratorNext(MyHashSetIterator* iterator);  
  53.   
  54. //删除一条数据,返回是否删除成功  
  55. int myHashSetRemoveData(MyHashSet * const set, void * const data);  
  56.   
  57. //将第二个Set的全部对象加入到第一个,返回增加的个数  
  58. int myHashSetAddAllSet(MyHashSet * set,MyHashSet *other);  
  59.   
  60. //复制HashSet  
  61. MyHashSet* myHashSetCopy(MyHashSet * set);  
  62.   
  63. //遍历  
  64. void myHashSetOutput(MyHashSet *set, void(*pt)(void*));  
  65.   
  66. #endif // MYHASHSET_H_INCLUDED  

源文件

[cpp]  view plain  copy
  1. # include "myHashSet.h"  
  2. #include <stdlib.h>  
  3. //创建HashSet  
  4. MyHashSet *createMyHashSet(int(*hashCode)(void *data), int(*equal)(void *data1, void *data2))  
  5. {  
  6.     MyHashSet *re = malloc(sizeof(MyHashSet));  
  7.     re->size = 0;  
  8.     re->loadFactor = DEFAULT_LOAD_FACTOR;  
  9.     re->initialCapacity = DEFAULT_INITIAL_CAPACITY;  
  10.     re->dataList = (MyList **) malloc(sizeof(MyList*) * re->initialCapacity);  
  11.     re->hashCode = hashCode;  
  12.     re->equal = equal;  
  13.     for (int i = 0; i < re->initialCapacity; i++)  
  14.     {  
  15.         re->dataList[i] = createMySearchList(equal);  
  16.     }  
  17.     return re;  
  18. }  
  19.   
  20. //使用全部参数创建HashSet  
  21. MyHashSet *createMyHashSetForAll(int initialCapacity, float loadFactor, int(*hashCode)(void *data), int(*equal)(void *data1, void *data2))  
  22. {  
  23.     MyHashSet *re = createMyHashSet(hashCode, equal);  
  24.     re->initialCapacity = initialCapacity;  
  25.     re->loadFactor = loadFactor;  
  26.     return re;  
  27. }  
  28.   
  29. //释放HashSet  
  30. void freeMyHashSet(MyHashSet * set)  
  31. {  
  32.     for (int i = 0; i < set->initialCapacity; i++)  
  33.     {  
  34.         freeMyList(set->dataList[i]);  
  35.     }  
  36.     free(set->dataList);  
  37.     free(set);  
  38. }  
  39.   
  40. //是否包含某个data  
  41. int myHashSetContains(MyHashSet * const set, void * const data)  
  42. {  
  43.     int hasCode = (*(set->hashCode))(data);  
  44.     hasCode %= set->initialCapacity;  
  45.     if (hasCode<0)  
  46.         hasCode+=set->initialCapacity;  
  47.     int re = myListFindDataIndex(set->dataList[hasCode], data);  
  48.     return re > -1;  
  49. }  
  50.   
  51. void rebuildMyHashSet(MyHashSet * set)  
  52. {  
  53.     int newSize = set->initialCapacity * 2;  
  54.     MyList **newdataList = (MyList **) malloc(sizeof(MyList*) * newSize);  
  55.     for (int i = 0; i < newSize; i++)  
  56.     {  
  57.         newdataList[i] = createMyList();  
  58.     }  
  59.     MyHashSetIterator* it = createMyHashSetIterator(set);  
  60.     while (myHashSetIteratorHasNext(it))  
  61.     {  
  62.         void * data = myHashSetIteratorNext(it);  
  63.         int hasCode = (*(set->hashCode))(data);  
  64.         hasCode %= newSize;  
  65.         myListInsertDataAtLast(newdataList[hasCode], data);  
  66.     }  
  67.     freeMyHashSetIterator(it);  
  68.     for (int i = 0; i < set->initialCapacity; i++)  
  69.     {  
  70.         freeMyList(set->dataList[i]);  
  71.     }  
  72.     free(set->dataList);  
  73.     set->dataList = newdataList;  
  74.     set->initialCapacity = newSize;  
  75. }  
  76.   
  77. //增加一条数据,返回是否添加成功  
  78. int myHashSetAddData(MyHashSet * const set, void * const data)  
  79. {  
  80.     int hasCode = (*(set->hashCode))(data);  
  81.     hasCode %= set->initialCapacity;  
  82.     if (hasCode<0)  
  83.         hasCode+=set->initialCapacity;  
  84.     int re = myListFindDataIndex(set->dataList[hasCode], data);  
  85.     if (re == -1)  
  86.     {  
  87.         myListInsertDataAtLast(set->dataList[hasCode], data);  
  88.         (set->size)++;  
  89.         if (set->size > set->initialCapacity * set->loadFactor)  
  90.         {  
  91.             rebuildMyHashSet(set);  
  92.         }  
  93.         return 1;  
  94.     }  
  95.     return 0;  
  96. }  
  97.   
  98. //数据的容量  
  99. int myHashSetGetSize(const MyHashSet * const set)  
  100. {  
  101.     return set->size;  
  102. }  
  103.   
  104. //创建迭代器  
  105. MyHashSetIterator* createMyHashSetIterator(MyHashSet * const set)  
  106. {  
  107.     MyHashSetIterator* re = (MyHashSetIterator*) malloc(  
  108.                                 sizeof(MyHashSetIterator));  
  109.     re->count = 0;  
  110.     re->index = 0;  
  111.     re->set = set;  
  112.     re->current = set->dataList[0]->first;  
  113.     return re;  
  114. }  
  115.   
  116. //释放迭代器  
  117. void freeMyHashSetIterator(MyHashSetIterator* iterator)  
  118. {  
  119.     free(iterator);  
  120. }  
  121.   
  122. //迭代器是否有下一个  
  123. int myHashSetIteratorHasNext(MyHashSetIterator* iterator)  
  124. {  
  125.     return iterator->count < iterator->set->size;  
  126. }  
  127.   
  128. //遍历下一个元素  
  129. void* myHashSetIteratorNext(MyHashSetIterator* iterator)  
  130. {  
  131.     (iterator->count)++;  
  132.     while (!(iterator->current))  
  133.     {  
  134.         (iterator->index)++;  
  135.         iterator->current = iterator->set->dataList[iterator->index]->first;  
  136.     }  
  137.     void * re = iterator->current->data;  
  138.     iterator->current = iterator->current->next;  
  139.     return re;  
  140. }  
  141.   
  142. //删除一条数据,返回是否删除成功  
  143. int myHashSetRemoveData(MyHashSet * const set, void * const data)  
  144. {  
  145.     int hasCode = (*(set->hashCode))(data);  
  146.     hasCode %= set->initialCapacity;  
  147.     if (hasCode<0)  
  148.         hasCode+=set->initialCapacity;  
  149.     int re = myListRemoveDataObject(set->dataList[hasCode], data);  
  150.     if (re)  
  151.     {  
  152.         (set->size)--;  
  153.     }  
  154.     return re;  
  155. }  
  156.   
  157. //将第二个Set的全部对象加入到第一个,返回增加的个数  
  158. int myHashSetAddAllSet(MyHashSet * set,MyHashSet *other)  
  159. {  
  160.     int ssize=set->size;  
  161.     MyHashSetIterator * it=createMyHashSetIterator(other);  
  162.     while (myHashSetIteratorHasNext(it))  
  163.     {  
  164.         myHashSetAddData(set,myHashSetIteratorNext(it));  
  165.     }  
  166.     freeMyHashSetIterator(it);  
  167.     int re=set->size-ssize;  
  168.     return re;  
  169. }  
  170.   
  171. //复制HashSet  
  172. MyHashSet* myHashSetCopy(MyHashSet * set)  
  173. {  
  174.     MyHashSet* re=createMyHashSetForAll(set->initialCapacity,set->loadFactor,set->hashCode,set->equal);  
  175.     myHashSetAddAllSet(re,set);  
  176.     return re;  
  177. }  
  178.   
  179. //遍历  
  180. void myHashSetOutput(MyHashSet *set, void(*pt)(void*))  
  181. {  
  182.     MyHashSetIterator * it=createMyHashSetIterator(set);  
  183.     while (myHashSetIteratorHasNext(it))  
  184.     {  
  185.         pt(myHashSetIteratorNext(it));  
  186.     }  
  187.     freeMyHashSetIterator(it);  
  188. }  

(4)测试文件

[cpp]  view plain  copy
  1. /************************* 
  2. *** File main.c 
  3. *** test for MyHashSet 
  4. **************************/  
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. #include "myEqual.h"  
  8. #include "myHashCode.h"  
  9. #include "myHashSet.h"  
  10.   
  11. #define S 10  
  12.   
  13. char* strs[S]=  
  14. {  
  15.     "abc",  
  16.     "qq",  
  17.     "hello",  
  18.     "abc",  
  19.     "lmy",  
  20.     "ab",  
  21.     "qq",  
  22.     "lqw",  
  23.     "sww",  
  24.     "lqw"  
  25. };  
  26.   
  27.   
  28. int main()  
  29. {  
  30.     //创建集合需要指定两个函数,hashCode函数和equal函数。  
  31.     MyHashSet * set = createMyHashSet(myHashCodeString, myEqualString);  
  32.   
  33.     //插入数据  
  34.     for (int i=0; i<S; i++)  
  35.     {  
  36.         myHashSetAddData(set, strs[i]);  
  37.     }  
  38.   
  39.     //输出大小  
  40.     printf("size=%d\n",myHashSetGetSize(set));  
  41.   
  42.     //测试删除  
  43.     myHashSetRemoveData(set,"qq");  
  44.     myHashSetRemoveData(set,"ab");  
  45.     myHashSetRemoveData(set,"qwert");  
  46.   
  47.     //输出大小  
  48.     printf("after remove size=%d\n",myHashSetGetSize(set));  
  49.   
  50.     //遍历  
  51.     MyHashSetIterator * it = createMyHashSetIterator(set);  
  52.     while(myHashSetIteratorHasNext(it))  
  53.     {  
  54.         char * pp= myHashSetIteratorNext(it);  
  55.         puts(pp);  
  56.     }  
  57.     //释放遍历器  
  58.     freeMyHashSetIterator(it);  
  59.   
  60.     //释放集合  
  61.     freeMyHashSet(set);  
  62.     return 0;  
  63. }  



Set结构的使用与实现 Set Set是继承自Collection的一个接口类; Set中只存储了key,并且要求key一定要唯一; Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的; 因为Set里面的key是不能够重复的,所以Set最大的功能就是对集合中的元素进行去重; 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表,用这个链表来记录元素的插入次序; Set中的 阅读详情

相关推荐

c语言实现通用数据结构(四):通用集合(HashSet)

这是在通用链表的基础上实现的椎栈,关于链表的实现参见:http://blog.youkuaiyun.com/swwlqw/article/details/22498833。 注意集合中只存储了指针,没有储存实际的数据。 对于新的数据类型来说,需要自定义HashCode函数和equal函数。 下面还给出了几个常见的hashCode函数和equal函数。 (1)HashCode函数 头文件

6716

线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

代码:(详解请看注释) #include<stdio.h> #include<stdlib.h>//动态分配需要的头文件 #define LIST_INIT_SIZE 100 #define LISTNCREAMENT 10 #define OK 1 #define FALSE 0 #define OVERFLOW 2//溢出 typedef float ElemType; typedef int Status; //线性表动态分配内存的顺序存储结构 typedef struct

绿色水杯 2164

集合的内部数据结构:深入探索Java集合的实现原理

Java集合框架是Java语言中用于存储和管理对象集合的一套丰富而强大的工具。集合的内部数据结构和算法对于理解集合的行为和性能至关重要。本文将深入探讨如HashMap、TreeMap、HashSet、LinkedHashSet等常用集合的内部数据结构和算法,并提供详细的代码示例。

哎 你看的博客 727

数据结构---set篇

关于这个题,我一开始想从前向后贪心,但是这会涉及到一个问题,前面如果都放小的,那么到最后把大的放后面,可能无解。所以从后往前贪心呗。方法进行删除,第三次超时是我把查找元素改成了。远远不用,利用红黑树维护的话最大也是。,我又想起那段实现红黑树可怕的日子。不得不超时,第二次超时是我用。当中删除元素需要经过内存的。复杂度查找元素之后使用。,找到位置,,再旋转,

weixin_52205764的博客 1180

C语言实现哈希集合算法

一个简单的哈希函数可以是将元素的ASCII码值相加,并对数组的大小取余。在这个哈希函数中,我们遍历元素的每个字符,将它们的ASCII码值相加得到一个总和。在这个结构体中,我们使用一个字符串指针数组来存储元素,以及一个整数来表示当前数组中的元素数量。在初始化函数中,我们将数组大小设置为0,并将数组中的所有元素指针初始化为NULL。为了完善我们的哈希集合实现,我们还可以定义一个查找函数来检查元素是否存在于集合中。最后,我们可以编写一个简单的示例程序来测试我们实现的哈希集合算法。C语言实现哈希集合算法。

DevWizard的博客 378

C语言实现hashset算法(附完整源码)

C语言实现hashset算法完整hash_set.h 头文件完整hash_set.c 源文件完整hashset算法(main测试函数) 完整hash_set.h 头文件 #ifndef __HASH_SET__ #define __HASH_SET__ #define DEFAULT_HASH_SET_CAPACITY 1 << 10 typedef struct { unsigned capacity; unsigned length; void **values;

希望我的博客,能帮上你解决学习中工作中所遇到的问题 963

c语言链表的数据结构,c语言实现通用数据结构(一):通用链表

忽然想起来,大概在两年之前学习C语言的时候,曾经用C语言写过一些通用的数据结构。主要也就实现了链表、队列、椎、HashSet,还有HashMap。当时只是知道标准的C语言中没有这方面的类库,后来才知道有很多第三方的类似这样的类库。废话不多说,先把代码粘过来。下面实现的是通用链表,注意链表中只存储了指针,没有储存实际的数据。头文件/**************************** File ...

weixin_42527178的博客 232

智能枕头

睡觉和吃饭是一样重要的,一个人想要健康的体魄,不仅要饮食得当,更需要有一个好的睡眠质量。随着人们生活品质的提高,人们对于睡眠的要求越来越高,那么就非常需要一款舒适的枕头。为了适应市场的需求,我爱物联网推出了智能枕头。因为智能枕头可以给头部及颈椎一个良好的承托力,舒适、柔软、放松,让人更好的进入睡眠。 目录 一、智能枕头方案介绍 二、智能枕头的优点 三、智能枕头功能介绍 四、智能枕头APP开发 五、...

6108我爱物联网方案开发优快云博客 3660

仓颉编程语言 HashSet 使用指南:去重集合的构造、遍历与增删改查

HashSet 是仓颉标准库 `std.collection` 包中基于哈希表实现的集合(Set)类型,用于存放**不重复**的元素,并支持高效的插入、删除与成员判断。本文以官方开发指南为核心,结合本仓库中 `std.collection` 包的源码与 API 文档,系统讲解 HashSet 的类型约束、五种构造方式、遍历与访问、增删改查以及集合运算等完整用法,帮助你快速上手并用 HashSet

gitblog_00118的博客 1098

AT32F435/437开发实战:把SD卡变成U盘的完整指南(含源码解析)

本文提供了基于AT32F435/437微控制器将SD卡改造为U盘的完整实战指南。通过深入解析USB MSC协议与SDIO驱动的协同工作原理,详细介绍了硬件设计要点、软件架构融合、核心源码解析以及从编译到文件传输的完整调试流程,帮助开发者实现可靠的大容量存储设备扩展。

weixin_29159127的博客 410

FPGA设计中的扇出约束实战:从XDC到代码优化的全流程解析

本文全面解析FPGA设计中扇出约束的重要性与应用,详细介绍了从XDC约束文件设置到HDL代码优化的全流程实战技巧。通过MAX_FANOUT约束控制信号负载,结合寄存器复制和物理优化策略,有效解决高扇出导致的时序违例和布线拥塞问题,提升设计性能和可靠性。

nept的博客 798

Java集合高级应用:HashSet、HashMap与Iterator详解

Java是典型的面向对象编程语言,其集合框架为数据管理提供了强大的工具。本文从面向对象编程的思想出发,深入解析集合框架中重要的`HashSet`、`HashMap`和迭代器(`Iterator`)。文章详细讲解了每个技术的概念、原理、常用方法和属性,并结合实例代码展示实际应用。通过比较和总结,初学者可以全面掌握这些技术,学会在不同场景下选择最优的数据结构与遍历方式,从而编写高效的Java代码。

qq_45832651的博客 738

brpc组件bvar源码解析(一)简介、使用和类的关系

bvar是brpc中的一个重要组件,brpc内部有很多builtin监控都是bvar实现的。 brpc文档介绍bvar“几乎不会给程序增加性能开销,也快于竞争频繁的原子操作”。它的原理是:多线程累加一个计数器时,每个线程只累加私有的变量而不参与全局竞争,因此写时没有锁的竞争;在读取时累加所有线程的私有变量。虽然读比之前慢多了,但写就快多了,因此它使用写多读少的场景,例如统计、监控场景。 1.使用 // bvar::Adder<T>用于累加,下面定义了一个统计read error总数的Adder。

华秋实的专栏 1852

赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!

面试官:那TreeSet要怎么定制排序?TreeSet的自定义排序我们要利用Comparator接口,通过向TreeSet传入自定义排序规则的Comparator来实现。官方源码是这么解释的,南友们看一看。// 构造一个新的空树集,根据指定的比较器进行排序。// 插入到集合中的所有元素都必须能够通过指定的比较器相互比较: comparator. compare(e1, e2)不得对集合中的任何元素e1和e2抛出ClassCastException。

JavaSouth南哥 2057

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1931

osgEarth 球上显示地形数据库

osgEarth 球上显示地形数据库 本文展示了一种由DSM和DEM得到Osgb工程,并在osgEarth球上显示的方法。其中DSM、DOM到Osgb工程的转换由VPB(VirtualPlanetBuilder)来实现,并采用Model图层将Osgb工程在球上显示。 本文主要解决一下问题: VPB编译 VPB生成地形 地形在球上显示 目录 1 前言 2 VPB编译与使用 3 地形在osgEarth球上显示 内容 1 前言 VirtualPlanetBuilder是一个开源代码工具,用于根据

CPWWHSU的博客 2439

仓颉语言 HashSet 集合类型完全指南:去重存储、遍历访问与增删操作实战

HashSet 是仓颉编程语言(Cangjie)标准库 `std.collection` 包中提供的一种**元素唯一**的哈希集合类型,适用于去重、成员快速判断、集合运算等场景。本文以开发指南中 [HashSet 章节](https://link.gitcode.com/i/39e3e03edc2d9e8f9ec28a59da985c92) 为主体,结合集合体系文档与泛型约束文档,系统讲解 Has

gitblog_00318的博客 211

Ubuntu24/Ubuntu22上安装Nvidia显卡驱动最新方案-可解决大多数nvidia-smi不识别和驱动无法加载问题

其实在19年的时候我就写过一篇文章用来安装nvidia显卡驱动的文章,只不过那个时候ubuntu还停留在ubuntu10,时间如梭,一眨眼ubuntu已经升级到ubuntu24了,我写这篇文章是为了给更多的人提供一些在配置nvidia显卡驱动过程中遇到的一些无法用AI,gpt类工具解决的问题。在Ubuntu 24上安装NVIDIA显卡驱动是一项重要的任务,因为它可以提高图形性能并确保系统正常工作。在这篇文章中,我们将介绍如何在Ubuntu 24上安装NVIDIA显卡驱动。

yolo模型训练找我,AI游戏合作找我 3311

gopkg高性能数据结构全解析:HashSet、SkipSet、LSCQ队列详解

在Go语言开发中,选择合适的数据结构对程序性能至关重要。gopkg作为一个通用的Go语言工具库,提供了多种高性能数据结构实现,包括HashSet、SkipSet和LSCQ队列。这些数据结构在并发场景下表现优异,能够显著提升程序的吞吐量和响应速度。本文将深入解析这三种数据结构的特性、适用场景和使用方法,帮助开发者在实际项目中做出最佳选择。 ## 1. HashSet:轻量级无序集合实现 Hash

gitblog_00855的博客 970

181、LLC谐振变换器的PCB设计实战(文件归档)

PCB设计实战经验总结:LLC谐振变换器的关键要点 本文通过实际案例总结了LLC谐振变换器PCB设计中的核心经验和常见误区。重点包括: 文件命名规范(项目代号_板卡类型_版本号_日期格式) 四层板标准层叠结构设计要点 谐振回路走线原则(宽度、长度控制) 地线处理技巧(功率地/控制地隔离) 散热设计注意事项(MOSFET过孔阵列、变压器布局) 完整的文件归档清单(Gerber、钻孔、装配图等) 作者特别强调,良好的设计归档习惯能显著降低生产问题概率,建议采用双重备份机制。文中多个真实案例(如谐振频率偏移、EM

Jack010169的博客 45

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

集合数据结构:原理、实现与多语言应用对比

集合(Set)作为计算机科学基础数据结构,通过哈希表或平衡二叉搜索树实现元素唯一性存储。其O(1)查询和去重特性,在数据库查询优化、图算法和机器学习特征工程中具有重要技术价值。Python的set基于哈希表实现快速查找,Java的TreeSet通过红黑树保持有序性,C++的std::set则提供高效范围查询。实际开发中需注意哈希冲突处理、线程安全等工程实践问题,例如在用户系统权限管理和大规模数据处理时,合理选择集合实现可显著提升性能。

weixin_30768881的博客 6

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HashSet集合的知识点

前一篇讲了整个Collection的概念跟常用的方法,这篇具体讲解一下关于HashSet的用法 HashSet是Set接口的实现,使用Set实现类时通常使用的就是该HashSet实现类,该类是按hash算法来存储集合中的元素,有良好的存储于查找性能 该类的特点 无序不重复,集合内元素顺序与添加时元素顺序不一致 集合中的元素可以为null 该集合不是同步的,多个线程同时访问同一个HashSet,必...

weixin_44363770的博客 1039

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

仓颉Collection集合实战指南:ArrayList、HashMap、HashSet如何快速选对

在仓颉(Cangjie)编程语言中,Collection 集合是处理数据的核心工具。掌握 **ArrayList 动态数组**、**HashMap 键值映射**和 **HashSet 去重集合** 的选型,能帮你写出更简洁、高效的代码。本文面向新手,用最少代码讲清"什么场景用什么集合",并给出仓颉集合实战技巧。 ## 🧭 一张表看懂仓颉四大集合 仓颉标准库 `std.collection`

gitblog_00711的博客 145

hashset treeset java_Java Set集合:HashSet和TreeSet类

Set 集合类似于一个罐子,程序可以依次把多个对象“丢进”Set 集合,而 Set 集合通常不能记住元素的添加顺序。也就是说 Set 集合中的对象不按特定的方式排序,只是简单地把对象加入集合。Set 集合中不能包含重复的对象,并且最多只允许包含一个 null 元素。Set 实现了 Collection 接口,它主要有两个常用的实现类:HashSet 类和 TreeSet类。HashSet 类Has...

weixin_28931507的博客 214

集合之ArrayList,HashSet,HashMap(总结实例)

集合之ArrayList,HashSet,HashMap 结合框架的体系结构: 一、List(列表) 1. List的特点 (1)List是元素有序并且可以重复的集合,称为序列 (2)List可以精确的控制每个元素的插入位置,或删除某个位置的元素 (3)List的两个主要实现类是ArrayList和LinkList 2. ArrayList的特点 (1)ArrayList底层是由数组实现的 (2)动态增长,以满足应用程序的需求 (3)在列比饿哦尾部插入或删除数据非常有效 (4)更适合查找和更新元素 (5)

qq_43273025的博客 1445

数据结构基础 -集合(Java)

数据结构基础 -集合(Java)

weixin_46619605的博客 1117
上一篇: c语言实现通用数据结构(一):通用链表
下一篇: 面试题你知道微服务么
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值