C语言中如何跳过存在于另一数组中的数组元素处理?
问题解决与优化方案
基础版代码修复
当前你的代码需要在内层循环找到匹配元素后,跳过后续的func1()调用。可以通过标记变量实现,同时注意实际场景中是指针比较,需修正判断条件:
for (int bl = 0; bl < array1_totlength; bl++) { int is_in_array2 = 0; // 标记当前元素是否被array2指向 /* 检查当前array1元素是否存在于array2的指针集合中 */ for (int l = 0; l < array2_totlength; l++) { // 实际场景为指针比较,取array1元素的地址与array2中的指针对比 if (array2[l] == &array1[bl]) { is_in_array2 = 1; break; // 找到匹配后直接跳出内层循环,避免无效遍历 } } // 仅当元素未被array2指向时,执行func1 if (!is_in_array2) { func1(array1[bl]); } }
高效优化方案
嵌套循环的时间复杂度为O(n*m),当array2元素较多时效率较低,推荐以下两种优化方式:
标记位法(最优效率)
在array1的结构体中新增一个布尔标记字段,用于标记该元素是否被array2指向:
typedef struct { // 原结构体字段 int your_data; // 新增标记:是否被array2引用 unsigned char is_referenced; } YourStruct;
每次向array2添加元素时,同步设置对应array1元素的标记:
// 示例:将array1[bl]加入array2 array2 = realloc(array2, (array2_totlength + 1) * sizeof(YourStruct*)); array2[array2_totlength] = &array1[bl]; array1[bl].is_referenced = 1; array2_totlength++;
后续遍历array1时,直接判断标记即可,时间复杂度降至O(n):
for (int bl = 0; bl < array1_totlength; bl++) { if (!array1[bl].is_referenced) { func1(array1[bl]); } }
哈希集合优化(无需修改结构体)
如果无法修改原结构体,可以用哈希集合存储array2中的指针,遍历array1时快速查询是否存在:
// 示例使用glib的GHashTable(需链接glib库) GHashTable* ref_table = g_hash_table_new(g_direct_hash, g_direct_equal); // 将array2的所有指针存入哈希表 for (int l = 0; l < array2_totlength; l++) { g_hash_table_add(ref_table, array2[l]); } // 遍历array1并过滤已被引用的元素 for (int bl = 0; bl < array1_totlength; bl++) { if (!g_hash_table_contains(ref_table, &array1[bl])) { func1(array1[bl]); } } // 释放哈希表资源 g_hash_table_destroy(ref_table);
内容的提问来源于stack exchange,提问作者hi everybody
相关产品推荐
相关产品推荐

