IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构之查找的经典 -> 正文阅读

[数据结构与算法]数据结构之查找的经典

数据结构_查找


顺序表查找

  • 顺序查找算法
/*顺序表查找*/
int sequentialSearch1(int * a, int n, int key)
{
	for (int i = 1; i <= n; i++)
	{
		if (a[i] == key)
		{
			return i;
		}
	}
	return 0;
}
  • 顺序查找算法的优化
/*顺序表查找的优化(带哨兵)*/
int sequentialSearch2(int * a, int n, int key)
{
	int i = n;
	a[0] = key;
	while (a[i] != key)
	{
		i--;
	}
	return i;
}

注: 哨兵解决了每次比较之后需要判断位置是否越界,提高了效率


有序表查找

  • 二分查找
/*二分查找*/
int binarySearch(int * a, int n, int key)
{
	int low = 1;
	int high = n;
	int mid = 0;
	while (low <= high)
	{
		mid = low + (high - low) >> 2;//防止溢出
		if (a[mid] < key)
		{
			low = mid + 1;
		}
		else if (a[mid] > key)
		{
			high = mid - 1;
		}
		else
			return mid;
	}
	return 0;
}
  • 插值查找

插值查找: mid = low + (key- a[low]) / (a[high] - a[low]) * (high - low)
适用于数据比较密集的查找操作

  • 斐波那契查找

线性索引查找

  • 稠密索引
  • 分块索引
    块内无序,块间有序 (块内使用顺序查找,块间使用二分查找)
  • 倒排索引

二叉排序树

  • 二叉树的存储结构
/*二叉树的二叉链表结构定义*/
typedef struct BiTNode
{
	int data;
	struct BiTNode * lChild;
	struct BiTNode * rChild;
}BiTNode, * BiTree;
  • 二叉排序树的插入(插入前先查找)
/*递归查找二叉排序T树中是否存在数据key*/
/*f指向双亲,初始调用值未NULL*/
/*查找成功时p指向找到的结点*/
/*查找失败时p指向访问的最后一个结点*/

bool searchBST(BiTree T, int key, BiTree f, BiTree * p)
{
	if (!T)       //查找不成功
	{
		*p = f;
		return false;
	}
	else if (key == T->data)  //查找成功
	{
		*p = T;
		return true;
	}
	else if (key < T->data)
	{
		return searchBST(T->lChild, key, T, p);
	}
	else
	{
		return searchBST(T->rChild, key, T, p);
	}
}

/*二叉排序树的插入*/
bool insertBST(BiTree * T, int key)
{
	BiTree p, s;
	if (!searchBST(*T, key, NULL, &p))
	{
		s = (BiTree)malloc(sizeof(BiTNode));
		s->data = key;
		s->lChild = s->rChild = NULL;

		if (!p)
		{
			*T = s;  //插入s为根结点
		}
		else if (key < p->data)
		{
			p->lChild = s;
		}
		else
		{
			p->rChild = s;
		}

		return true;
	}
	else
		return false;
}
  • 二叉排序树的删除
//依赖p的前驱结点删除
bool delF(BiTree * p)
{
	BiTree q, s;

	if (NULL == (*p)->rChild)//右子树为空
	{
		q = *p;
		*p = (*p)->lChild;
		//free(q);
	}
	else if (NULL == (*p)->lChild)//左子树为空
	{
		q = *p;
		(*p) = (*p)->rChild;
		free(q);
	}
	else
	{
		q = *p;
		s = (*p)->lChild;
		while (s->rChild) //找到p的前驱结点s,q为s的双亲结点
		{
			q = s;
			s = s->rChild;
		}

		(*p)->data = s->data;

		if (q != *p)
		{
			q->rChild = s->lChild;
		}
		else
		{
			q->lChild = s->lChild;
		}
		free(s);
	}

	return true;
}

//依赖p的后继结点删除
bool delR(BiTree * p)
{
	BiTree q, s;

	if (NULL == (*p)->rChild)//右子树为空
	{
		q = *p;
		*p = (*p)->lChild;
		//free(q);
	}
	else if (NULL == (*p)->lChild)//左子树为空
	{
		q = *p;
		(*p) = (*p)->rChild;
		free(q);
	}
	else
	{
		q = *p;
		s = (*p)->rChild;
		while (s->lChild) //找到p的前驱结点s,q为s的双亲结点
		{
			q = s;
			s = s->lChild;
		}

		(*p)->data = s->data;

		if (q != *p)
		{
			q->lChild = s->rChild;
		}
		else
		{
			q->rChild = s->rChild;
		}
		free(s);
	}

	return true;
}

bool deleteBST(BiTree * T, int key)
{
	if (!*T) //找不到
	{
		return false;
	}
	else  
	{
		if (key == (*T)->data) //找到要删除的结点
		{
			return delR(T);
		}
		else if (key < (*T)->data)
		{
			deleteBST(&(*T)->lChild, key);
		}
		else
		{
			deleteBST(&(*T)->rChild, key);
		}
	}
}
  • 二叉树的遍历
/*中序遍历*/
void InorderBST(BiTree T)
{
	if (!T)
	{
		return;
	}
	InorderBST(T->lChild);
	printf("%d ", T->data);
	InorderBST(T->rChild);

}

总结:

  • 二叉排序树保留了插入和删除不用移动元素的优点
  • 二叉排序树走的就是从结点到要查找结点的路径
  • 二叉排序树的查找性能取决于二叉树的形状,这就有了接下来的二叉平衡树
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:32:05  更:2021-08-13 12:34:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 3:32:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码