C语言数据去重处理的三种方法
创作时间:
作者:
@小白创作中心
C语言数据去重处理的三种方法
引用
1
来源
1.
https://docs.pingcode.com/baike/1077530
在C语言中对数据进行去重处理,可以使用哈希表、排序和双指针、以及暴力枚举等方法,其中哈希表方法较为高效。接下来将详细解释哈希表方法在C语言中的实现。
一、哈希表去重方法
1. 初始化哈希表
在C语言中,可以使用unordered_map(在C++中)或自己实现一个简单的哈希表来存储已经遇到的元素。
#include <stdio.h>
#include <stdlib.h>
typedef struct HashNode {
int key;
struct HashNode* next;
} HashNode;
#define HASH_TABLE_SIZE 1000
HashNode* hashTable[HASH_TABLE_SIZE];
unsigned int hashFunction(int key) {
return key % HASH_TABLE_SIZE;
}
void initHashTable() {
for (int i = 0; i < HASH_TABLE_SIZE; i++) {
hashTable[i] = NULL;
}
}
2. 插入和查找元素
在哈希表中插入新元素,并查找已有元素。
int searchHashTable(int key) {
unsigned int hashIndex = hashFunction(key);
HashNode* node = hashTable[hashIndex];
while (node != NULL) {
if (node->key == key) {
return 1;
}
node = node->next;
}
return 0;
}
void insertHashTable(int key) {
if (searchHashTable(key)) {
return;
}
unsigned int hashIndex = hashFunction(key);
HashNode* newNode = (HashNode*)malloc(sizeof(HashNode));
newNode->key = key;
newNode->next = hashTable[hashIndex];
hashTable[hashIndex] = newNode;
}
3. 数据去重
通过哈希表对数据进行去重处理。
void removeDuplicates(int* array, int size) {
initHashTable();
int* result = (int*)malloc(size * sizeof(int));
int resultSize = 0;
for (int i = 0; i < size; i++) {
if (!searchHashTable(array[i])) {
insertHashTable(array[i]);
result[resultSize++] = array[i];
}
}
for (int i = 0; i < resultSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result);
}
int main() {
int array[] = {1, 2, 2, 3, 4, 4, 5};
int size = sizeof(array) / sizeof(array[0]);
removeDuplicates(array, size);
return 0;
}
二、排序和双指针方法
1. 对数组进行排序
首先对数组进行排序,这样相同的元素会在一起。
#include <stdio.h>
#include <stdlib.h>
int compare(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
void removeDuplicatesUsingSorting(int* array, int size) {
qsort(array, size, sizeof(int), compare);
int* result = (int*)malloc(size * sizeof(int));
int resultSize = 0;
for (int i = 0; i < size; i++) {
if (i == 0 || array[i] != array[i - 1]) {
result[resultSize++] = array[i];
}
}
for (int i = 0; i < resultSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result);
}
int main() {
int array[] = {1, 2, 2, 3, 4, 4, 5};
int size = sizeof(array) / sizeof(array[0]);
removeDuplicatesUsingSorting(array, size);
return 0;
}
三、暴力枚举方法
1. 遍历数组
通过嵌套循环遍历数组,判断每个元素是否在结果数组中出现过。
#include <stdio.h>
#include <stdlib.h>
void removeDuplicatesUsingBruteForce(int* array, int size) {
int* result = (int*)malloc(size * sizeof(int));
int resultSize = 0;
for (int i = 0; i < size; i++) {
int found = 0;
for (int j = 0; j < resultSize; j++) {
if (array[i] == result[j]) {
found = 1;
break;
}
}
if (!found) {
result[resultSize++] = array[i];
}
}
for (int i = 0; i < resultSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result);
}
int main() {
int array[] = {1, 2, 2, 3, 4, 4, 5};
int size = sizeof(array) / sizeof(array[0]);
removeDuplicatesUsingBruteForce(array, size);
return 0;
}
四、总结
哈希表方法适用于需要高效处理大量数据去重的场景,排序和双指针方法适用于数据量适中且排序时间可接受的情况,而暴力枚举方法则适用于数据量较小的情况。选择合适的方法可以有效提高程序的性能和可维护性。
热门推荐
阿托伐他汀进口药比国产贵20多倍!选哪种?可对照这3点选择!
神创万物,那神又源自何方?科学与信仰的深刻对话
血型是否可以判断亲子关系?亲子鉴定和血型有什么不同?
这位顶级人类学家为何要说:“我们都是食人族”
研究表明大蒜能辅助降低血糖和胆固醇
霍华德·马克斯:认识并接受周期
15件小事降血糖逆转糖尿病 不用戒甜品/淀粉?要先吃菜再吃饭?
哪些措施可以完善薪酬绩效管理制度以提升员工积极性?
浅谈:蒙古族的礼仪文化
最新入团申请书的格式
MBR分区和GPT分区有什么区别?一文详解两种硬盘分区方式
电信诈骗发红包案例分享:法律分析与防范策略
韩语和朝鲜语区别
岭北盐焗鸡烹饪工艺规范
职称评审,高级答辩常见哪些问题?注意这几点能轻松应对!
女性五行命理最佳解析
YOLO-World:实时开放词汇目标检测
日语标点符号使用指南
评论区成求职区?大学生求职新场景
2024年河北经贸大学经济管理学院热门专业全国排名 有哪些专业比较好
执业中药师的出路是什么 月薪多少钱
左手无名指戴戒指的文化象征:东西方差异与现代多元解读
企业制定休假制度需遵循哪些劳动法条款?
员工有病假证明,企业必须批准吗?这6种病假无效
豆腐店一定要知道的豆腐皮的保存方法
建筑装饰行业分红透视:去年派息486亿,中国建筑等现金分红金额居前
腹部动脉瘤一定要手术吗?能治好吗
输血前的这些检查,一定要做!
看看8000人民币,在芬兰能过上几天潇洒生活,结果可能让你失望了
怎么驯服虎皮鹦鹉不咬人,可放在温暖的环境中静养2-3天