查找算法解析:线性表与树表查找

需积分: 10 1 下载量 27 浏览量 更新于2024-08-20 收藏 1.27MB PPT 举报
"这篇资料主要介绍了查找的基本概念和几种常见的查找方法,包括线性表的查找、树表查找以及哈希表查找。其中,重点讲解了RR型调整代码在AVL树平衡调整中的应用,以及线性表的顺序查找和折半查找。" 《查找》第8章详细解析: 一、基本概念 1. 查找表:是一种数据结构,用于存储一组数据并提供搜索特定数据的能力。 2. 关键字:是用于区分数据记录的关键字段。 3. 查找:根据给定的关键字在查找表中寻找相应的数据记录。 4. 查找成功/查找不成功:成功找到关键字对应的记录或未能找到。 5. 静态查找和动态查找:静态查找针对已知大小的表,而动态查找适用于表大小变化的情况。 6. 查找效率和平均查找长度:衡量查找性能的重要指标,平均查找长度越小,效率越高。 二、线性表的查找 1. 顺序查找:从表头开始逐个比较,直到找到目标关键字或遍历完整个表。顺序查找改进算法引入了前哨站,从表尾开始查找,可减少平均查找长度。 - 常规顺序查找ASL(Average Search Length)公式:`ASL = 1 + 1/2 + 1/3 + ... + 1/n` - 改进后的顺序查找ASL:当查找失败时,平均查找长度为`n+1`;成功时,根据查找位置不同,查找长度在1到n之间。 2. 折半查找:适用于有序表,通过比较目标关键字与中间元素,每次将查找范围减半,提高查找速度。 三、AVL树的RR型调整 RR型调整是AVL树平衡调整的一种,用于处理右右不平衡情况。当以节点a为根的子树出现右右不平衡时,可以通过右旋操作来恢复平衡。 - RR型旋转步骤: - 以a为根节点的最小不平衡子树进行调整。 - b指向a的右子树根节点。 - 将b的左子树挂接到a的右子树位置。 - 将a挂接到b的左子树。 - 更新a和b的平衡因子为0,表示它们现在是平衡的。 - 返回新的根节点b。 四、其他查找方法 除了线性表查找,还有树表查找(如二叉搜索树、AVL树、红黑树等)和哈希表查找,它们各有优势,适用于不同的场景。树表查找通常具有较好的最坏情况性能,而哈希表查找在理想情况下可以达到常数时间复杂度。 总结,查找是数据处理的基础,了解并掌握各种查找方法及其优化策略对于提升数据操作效率至关重要。RR型调整是AVL树保持平衡的关键操作,而线性表的查找策略如顺序查找和折半查找则提供了在非平衡或有序结构中搜索数据的不同途径。

简化这段代码unsigned int rr2buf(char *o, dns_rr* rr) { int i = 0; uint16_t temp; uint32_t temp32; temp = htons(49164); memcpy(o, &temp, sizeof(short)); o+=2; temp=htons(rr->type); memcpy(o, &temp, sizeof(short)); o+=2; temp=htons(rr->rclass); memcpy(o, &temp, sizeof(short)); o+=2; temp32=htonl(rr->ttl); memcpy(o, &temp32, (2*sizeof(short))); o+=4; temp=htons(rr->data_len); memcpy(o, &temp, sizeof(short)); o+=2; if(rr->type == MX_TYPE){ temp=htons(1); memcpy(o, &temp, sizeof(short)); o+=2; } if(rr->type == A_TYPE){ uint32_t ipAddr = inet_addr(rr->rdata); memcpy(o, &ipAddr,rr->data_len); o+=rr->data_len; return 16; } else if(rr->type == CNAME_TYPE){ char* ini = o; uint8_t count = 0; int i = 0; int j = 1; int tempts = 0; o++; while(1){ if(rr->rdata[i] == '.'){ memcpy(o-count-1, &count, sizeof(char)); count = 0; o++; i++; tempts = 1; } else if(rr->rdata[i] == '\0'){ memcpy(o, &(rr->rdata[i]), sizeof(char)); memcpy(o-count-1, &count, sizeof(char)); count = 0; break; } else{ memcpy(o, &(rr->rdata[i]), sizeof(char)); o++; i++; count++; } } return 12 + rr->data_len + 1; } else if(rr->type == MX_TYPE){ char* ini = o; uint8_t count = 0; int i = 0; int j = 1; int tempts = 0; o++; while(1){ if(rr->rdata[i] == '.'){ memcpy(o-count-1, &count, sizeof(char)); count = 0; o++; i++; tempts = 1; break; } else if(rr->rdata[i] == '\0'){ memcpy(o, &(rr->rdata[i]), sizeof(char)); memcpy(o-count-1, &count, sizeof(char)); count = 0; break; } else{ memcpy(o, &(rr->rdata[i]), sizeof(char)); o++; i++; count++; } } o--; temp = htons(49164); //这里指代1100000000001100,DNS报文中压缩指针的操作 memcpy(o, &temp, sizeof(short)); return 16+i; } }

2023-06-06 上传