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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-08-04计算机各种算法上 -> 正文阅读

[数据结构与算法]2021-08-04计算机各种算法上

算法:
广义:解决特定问题的方法。
狭义:数据结构具备的功能。

算法的特征:
有穷性:
算法应该在有限步骤内完成。
确切性:
算法的每一步骤必须要有目的性且无歧义。
输入项:指n个输入的值用于算法运算,输入个数可以为0这种情况特指算法本身给定了初始条件举个简单的例子:

void HelloWrold(void)
{
	printf("hello wrold");
}

输出项:
算法应该有一个及以上的输出项,没有输出的算法无意义。算法必须有输出。
可行性:
一个算法必须在现有的条件里可行且符合常理,那些理论上可行的不一定能实现,举个例子:

//计算出100万秒等于多少小时。
void time(void)
{
	//读取当前时间(年月日)time1;
	while(i<1000000)
	{
		sleep(1);
		i++;
	}
	//读取当前时间(年月日)time2;
	time1-time2=100万秒的天数。
}

这个算法确实可以求出100万秒等于多少天,但是正常人都不会这么用,这就是可行性为0;类似于给喜马拉雅山造电梯或给马里亚纳海沟贴瓷砖一样,成功率不为0但是一定不可能发生

算法的评定:正确性、时间复杂度、空间复杂度、可读性、健壮性。
正确性:
一个算法的首要前提是正确性,即结果正确,如果不正确时间复杂度、空间复杂度、可读性、健壮性这些都将毫无意义。

时间复杂度:
一个用于描述算法在执行时,随着输入参数数量的变化,而执次数发生变化的函数。
一般采用大O表示法:O(函数)

常见的时间杂度:
常数阶 O(1)
对数阶 O(logn)
线性阶 O(n)
线性对数阶 O(nlogn)
平方阶 O(n^2)
指数阶 O(2^n)

空间复杂度:
一个用于描述算法在执行时,随着输入参数数量的变化,而需要存储空间发生变化的函数。

常见的空间复杂度:
O(1)、O(n)、O(2n)、O(n^2)

查找算法:
顺序查找:
最简单的一种查找算法,对待查找数据没有要求.
时间复杂度为:O(n)
这是最简单的查找代码如下:

for(int i=0;i<100;i++)
{
	if(a[i]==x)
		return x;
}

二分查找:
效率比较高的一种查找算法,要求待查找数据有序。
时间复杂度:O(logn)
如果有多个符合的数据,返回的下标是不确定的。
部分代码如下:

//假设是升序min初始为0,max初始为100;
if(x<a[mid])
max=(max+min)/2;
if(x>a[mid])
min=(max+min)/2;

哈希查找:
首先要创建哈希表,创建哈希表的前提是对数据有一定了解。
创建哈希表最重要的就是解决数据冲突问题,没有固定统一的方法,要根据数据的特性找到合适的方法。
一旦哈希表创建完成它查找的时间复杂度接近O(1)。
速度虽然很快,但有很大的局限性。
假设有十三个数,同时用7求余,然后根据余数找,对除数没有特别要求,什么合适用什么。找到余数后再具体找值。比如a[10] = {2,3, 4 ,5, 6, 7, 8, 9, 10, 15}
构建哈希表用7求余变成b[10]={2,3,4,5,6,0,1,2,3,1}然后要找的x备份后也求余x=8,y=1,去b[]里找1,找到后对应a中的8,15.这两个里找8,就方便多了。

块查找:
当面对海量数据时,可以根据数据的特性,把数据分块、再分块降低数据规模,再使用以查找算法查找数据。类似于找身份证,找一个身份证码先找开头的地区再出生年月,最后找精确的人,这样就能减少一大部分时间
下面是各种排序。
排序算法:
排序算法的稳定性:
当待排序的数据中有相同的数据,排序算法是否会更改它们的前后关系,不会更改的叫稳定排序,可能会更改的叫不稳定排序。

冒泡:
特点:找到目标值后移动对数据的有序性敏感
是否稳定:稳定
时间复杂度:O(n) O(n^2)
空间复杂度:O(1)
选择:
特点:找到目标之后和目标位交换,数据的交换次数少,如果待排序的数据字节较多,选择排序是一个不错的方案。
是否稳定:不稳定
时间复杂度:O(n^2)
空间复杂度:O(1)
插入:
特点:目标插入到数组,数据的交换次数少,适合对有序的数据添加新的数据。
是否稳定:
是否稳定:稳定
时间复杂度:O(n^2)
空间复杂度:O(1)
希尔:
特点:在插入排序的基础添加增量概念,提高了数据到达合适位置的速度。
是否稳定:不稳定
时间复杂度:O(nlogn)
空间复杂度:O(1)

堆:
特点:把数据看作完全二叉树,然后把这个二叉树调整为大根堆,然后把堆顶的数据交换到末尾,再把二叉树的数量-1,再调整为大根堆,直到二叉树的数量为1,排序完成。
是否稳定:不稳定
时间复杂度:O(nlogn)
空间复杂度:O(1)

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:43:03-

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