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;
}
四、总结
哈希表方法适用于需要高效处理大量数据去重的场景,排序和双指针方法适用于数据量适中且排序时间可接受的情况,而暴力枚举方法则适用于数据量较小的情况。选择合适的方法可以有效提高程序的性能和可维护性。
热门推荐
家庭药箱配置全攻略:7类药品+储存指南,轻松应对常见不适
如何理解A Level数学中的界限概念
吉兰-巴雷综合征怎么检查
黄赌毒是什么?相关法律处罚及缓刑适用条件详解
《甄嬛传》纯元皇后:白月光还是家族棋子?
这些年轻人为何选择回到东北
工业建筑绿色发展:从设计到运营的全方位实践
AI、AGI、AIGC之间区别与联系
任子行涉信披违规被立案 子公司两年亏8123万多期财报出错
从《锦奁曾叠》读5000年古代妆具史
CysC与NGAL、Cr的关系
亚冠精英联赛冠军奖金1000万美元 参赛奖金80万美元
50句经典爱情蜜语
如何制定现货黄金的交易策略?这些交易策略如何适应市场变化?
看春运里消费“新”趋势 感受中国经济发展澎湃活力
就业数据再传危险信号,去年8月一幕是否会重演
高性价比全屋智能家居攻略:选购指南与实用建议
肠溶片是什么意思
徐静雨犀利点评姚主席:中国男篮的三大遗憾,姚明必须承担责任
编导笔试|视听语言之景别篇
如何解决Windows 11中的HDMI问题
血脂管理项目共识怎么写
主播平台与主播之间的法律关系如何认定
时尚烧烤店的装修设计风格如何吸引年轻顾客?
玉牌与银牌对比分析:材质、寓意、保养全方位解析,哪一款更适合您?
智能设备守护独居老人安全
“且”字的多重含义与用法探讨:从古文到现代汉语的演变解析
中国最美小岛,广西北海的旅游名片,却被称国内十大最坑景点之一
补充鱼油是一场骗局吗?
广州南站:“超级枢纽”地位日益突出