数据结构算法

什么是数据结构?什么是算法?我该怎么学习数据结构与算法? 01 前言 学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。 本文将回顾数据结构与算法的基础知识,学习日常所接触场景中的一些算法和策略,以及这些算法的原理和他背后的思想,最后会动手写代码,用java里的数据结构来实现这些算法,如何去做? 02 基本概念回顾 2.1 什么是数据结构? 1)概述 数据结构是计算... 阅读详情

算法:

数据结构中的算法,指的是数据结构所具备的功能
解决特定问题的方法,它是前辈们的一些优秀的经验总结

输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算
		法本身定出了初始条件;
输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算
		法是毫无意义的;
确定性:算法中的每一条指令必须有确切的含义,不能产生多义性:
可行性:算法中的每一条指令必须是切实可执行的,即原则上可以通过已经实现的基
		本运算执行有限次来实现(也称之为有效性);
有穷性:算法必须能在有限步后终止;
时间复杂度:
由于计算机的性能不同,无法准确地计算出算法执行所需要的时间
因此我们用算法执行的次数来代表算法的时间复杂度 O(公式) 一般忽略常量
    
    常见的时间复杂度:
    //  O(1)
        printf("%d");
    //  O(logn)
    for(int i=n; i>=0; i=i/2)
    {
        printf("%d");
    }
    //  O(n)
    for(int i=0; i<n; i++)
    {
        printf("%d");
    }
    // O(nlogn) 
    for(int i=0; i<n; i++)
    {
        for(int j=n; j>=0; j/=2)
        {
            printf("d");
        }
    }
    //  O(n^2)
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            printf("%d");
        }
    }
排序算法:
排序算法的稳定性:
    在待排序的数据中,如果有相同的数据,排序过程中不会改变它们的先
    后顺序,则认为该排序算法是稳定的 
冒泡:
    数据左右进行比较,把最大的数据交换到最后,特点是该算法对数据的有序性
    	敏感,在排序的过程中发现有序可以立即停止排序。
    如果待排序的数据基本有序,则冒泡排序的效率是非常高的
        时间复杂度: 最好O(n) 平均O(n^2)
        稳定的
//	冒泡排序
void bubble_sort(int* arr,size_t len)
{
	//	标志位判断排序是否已经完成
	bool flag = true;
	for(int i=len-1; i>0 && flag; i--)
	{
		flag = false;
		for(int j=0; j<i; j++)
		{
			if(arr[j] > arr[j+1])	
			{
				swap(arr[j],arr[j+1]);
				flag = true;
			}
		}
	}
}
选择:
    假定最开始的位置是最小值并记录下标min,然后与后面的数据进行比较,
    如果有比min为下标的数据小的则更新min,最后如果min的位置与开始位置
    发生了改变,则交换min位置的数据与开始位置的数据,以此类推。
    虽然时间复杂度挺高的,但是数据交换的次数比较少,因此实际运行时间
    并不慢(交换比比较耗时)
        时间复杂度: O(n^2)
        不稳定   1 10 10
//	选择排序
void select_sort(int* arr,size_t len)
{
	for(int i=0; i<len-1; i++)
	{
		int min = i;
		for(int j=i+1; j<len; j++)
		{
			if(arr[j] < arr[min]) min = j;	
		}
		if(min != i) swap(arr[i],arr[min]);
	}
}
插入:
    把数据看作两部分,一部分是有序,把剩余的数据逐个插入进去。
    适合对已经排序后的数据,新增数据后进行排序
        时间复杂度: O(n^2)
        稳定的
    //	插入排序
void insert_sort(int* arr,size_t len)
{
	for(int i=1,j; i<len; i++)
	{
		int val = arr[i];
		for(j=i; j>0 && arr[j-1] > val; j--)
		{
			arr[j] = arr[j-1];
		}
		if(j != i) arr[j] = val;
	}
}
希尔:
    是插入排序的增强版,由于插入排序时,数据的移动速度比较慢,所以增加了
    增量的概念,以此来提高排序速度
        时间复杂度:O(n^2)
        不稳定
    //	希尔排序 0  1 2   3 4 5
void shell_sort(int* arr,size_t len)
{
	for(int k=len/2; k>0; k/=2)
	{
		for(int i=k,j; i<len; i++)
		{
			int val = arr[i];
			for(j=i; j-k>=0 && arr[j-k]>val; j-=k)
			{
				arr[j] = arr[j-k];	
			}
			if(j != i) arr[j] = val;
		}
	}
}
快速:
    找到一个标杆,一方面从左边找比标杆大的数据,找到后把数据放在标杆右边,
    另一方面从右边找比标杆小的数据,找到后放在标杆的左边,最终标杆左边的数
    据比右边的小,这次就两部分有序,然后用同样的方法排序标杆左边和右边的数
    据
    特点:综合性最高,因此叫快速排序,笔试面试考得最多的排序算法
    时间复杂度:O(nlogn)
    不稳定
void _quick_sort(int* arr,int left,int right)
{
	if(left >= right) return;

	//	计算标杆的下标
	int pi = (left+right)/2;
	//	备份标杆的数据
	int pv = arr[pi];
	//	备份左右下标
	int l = left,r = right;

	for(int i=left; i<=right; i++)
	{
		if(i==pi) printf("[%d] ",arr[i]);
		else printf("%d ",arr[i]);
	}
	printf("\n");

	while(l < r)
	{
		//	在标杆左边找比它大的数据
		while(l < pi && arr[l] <= pv)  l++;
		if(l < pi)
		{
			arr[pi] = arr[l];
			pi = l;
		}
		//	在标杆右边找比它小的数据
		while(r > pi && arr[r] >= pv) r--;
		if(r > pi)
		{
			arr[pi] = arr[r];
			pi = r;
		}
	}
	//	还原标杆的数据
	arr[pi] = pv;
//	show_arr(arr,LEN);
	if(pi-left>1)	 _quick_sort(arr,left,pi-1);
	if(right-pi>1) 	 _quick_sort(arr,pi+1,right);

}

//	快速排序
void quick_sort(int* arr,size_t len)
{
	_quick_sort(arr,0,len-1);
}
归并:
    把一组数据拆分成单独的个体,然后按照从小到大的顺序复制到临时空间,
    复制完成后再从临时空间拷贝到原内存中。
    特点:由于需要使用额外内存空间来避免数据交换的耗时,是一种典型的
    以空间换时间的排序算法
    时间复杂度:    O(nlogn)
    稳定的
void merge(int* arr,int* tmp,int l,int p,int r)
{
	//	l是左部分最小,p是左部分最大    p+1是右部分最小,r是右部分最大
	//	左右部分各自有序
	if(arr[p] < arr[p+1]) return;

	int i=l,j=p+1,k=l;
	while(i<=p && j<=r)
	{
		//	左右部分从左开始比较,谁小谁放入tmp
		if(arr[i] < arr[j])
			tmp[k++] = arr[i++];
		else
			tmp[k++] = arr[j++];
	}
	//	其中一部分比较完成,另一部分全部放入tmp末尾
	while(i<=p) tmp[k++] = arr[i++];
	while(j<=r) tmp[k++] = arr[j++];
	
	memcpy(arr+l,tmp+l,4*(r-l+1));
}

void _merge_sort(int*arr,int* tmp,int l,int r)
{
	//	拆分
	if(l >= r) return;
	int p = (l+r)/2;
	_merge_sort(arr,tmp,l,p);
	_merge_sort(arr,tmp,p+1,r);
	//	合并
	merge(arr,tmp,l,p,r); //l~p  p+1~r

}

//	归并排序
void merge_sort(int* arr,size_t len)
{
	//	申请临时空间
	int* tmp = malloc(4*len);
	_merge_sort(arr,tmp,0,len-1);
	free(tmp);
}
堆:
    先把数据当做完全二叉树,然后把树调整成大根树,然后把根节点交换到数组
    最后,然后数量--,然后再调整成大根树,以此类推,直到数量为1时结束,
    可以递归、也可以循环实现
    时间复杂度:O(nlogn)
    不稳定的
 void create_heap(int* arr,int root,size_t len)
{
	//	root是根节点的下标
	if(root >= len) return;

	//	左右子树下标
	int left = root*2+1;	//(root+1)*2-1
	int right = root*2+2;	//(root+1)*2+1-1
	//	确保左右子树为左右部分的最大值
	create_heap(arr,left,len);
	create_heap(arr,right,len);
	//	右子树存在,并且右子树大于左子树,则交换
	if(right < len && arr[right] > arr[left])
		swap(arr[right],arr[left]);
	//	左子树存在,并且左子树大于根,则交换
	if(left < len && arr[left] > arr[root])
		swap(arr[left],arr[root]);
}

//	堆排序
void heap_sort(int* arr,size_t len)
{
	//	调整成大顶堆
	create_heap(arr,0,len);
	for(int i=len-1; i>0; i--)
	{
		//	交换根节点与末尾节点
		swap(arr[0],arr[i]);	
		//	重新调整成大顶堆
		create_heap(arr,0,i);
	}
}

void heap_sort_for(int* arr,size_t len)
{
	//	从下往上调整成大顶堆
	for(int i=len-1; i>0; i--)
	{
		int p = (i+1)/2-1;
		if(arr[p] < arr[i])
			swap(arr[p],arr[i]);
	}

	for(int i=len-1; i>0; i--)
	{
		swap(arr[0],arr[i]);
		//	重新调整
		for(int j=0; j<i; j++)
		{
			if(j*2+2 < i && arr[j*2+2] > arr[j*2+1])
				swap(arr[j*2+2],arr[j*2+1]);
			if(j*2+1 < i && arr[j*2+1] > arr[j])
				swap(arr[j*2+1],arr[j]);
		}
	}
}
计数:
    找出数据中的最大值、最小值,并创建哈希表,把数据-最小值作为哈希表数组
    的下标来访问哈希表并+1,然后遍历哈希表,如果数据大于0时,则把下标+最
    小值还原回数据,依次放回原数组中,达到排序的目的。
    该排序算法理论上速度是非常快,但是有很大的局限性,适合整型数据,而且
    数据的差值不宜过大,否则会非常浪费内存,也是以空间换时间的排序算法
    时间复杂度:O(n+k)  k是整数的范围
    稳定的
 //	计数排序
void count_sort(int* arr,size_t len)
{
	int min = arr[0],max = arr[len-1];
	for(int i=0; i<len; i++)
	{
		if(arr[i] > max) max = arr[i];
		if(arr[i] < min) min = arr[i];
	}
	// 创建哈希表
	int* tmp = calloc(4,max-min+1);
	for(int i=0; i<len; i++)
	{
		tmp[arr[i]-min]++;
	}
	for(int i=0,j=0; i<max-min+1; i++)
	{
		while(tmp[i]--) 
		{
			arr[j++] = i+min;	
		}
	}
	free(tmp);
}
桶:
    把数据根据值来存储到不同的桶,然后再调用其它的排序算法,对桶中的数据
    进行排序,然后再拷贝回数组中,以此达到降低排序规模来减少排序的时间,
    也是以空间换时间的方式。
    缺点:如何分桶,桶定义多大
    时间复杂度:O(n+k)
    稳定的
基数:
    是桶排序的具体实现,首先创建10个队列,然后逆序计算出数据的个十百千...
    然后分别压入对应的队列中,然后从队列中弹出存储的数据到数组中。
    缺点:只适合排序正整数,需要准备很大的空间,也是空间换时间
    时间复杂度:O (nlog(r)m),其中r为所采取的基数,而m为堆数
    稳定的
Java的数据结构和算法 今天我们来简单介绍一下Java的数据结构和算法。 一、数据结构 1、数据结构的分类 2、数据结构的基本功能 二、算法 1、算法是什么 2、算法的特点 一、1、数据结构是计算机组织、存储数据的方式。简单来说就是,数据按指定的规则进行存储,从而得到一个有固定存储格式的数据集合,就称之为“数据结构” 数据结构又分为:①数组 (Array) ②栈 (Stack) ③队列 (Queue) ④链表 (Linked ... 阅读详情

相关推荐

PICO+Unity MR空间网格开发实战:从零构建透视交互场景

本文详细介绍了使用PICO 4 Ultra与Unity引擎进行MR空间网格开发的完整实战流程。从环境准备、项目初始化、核心组件配置,到空间网格的生成、可视化与物理交互实现,手把手教你构建一个能识别真实环境并发射虚拟小球的透视交互场景。文章重点解析了PICO SDK中空间网格功能的关键配置与优化技巧,并提供了真机部署与调试的实用指南。

e3f4g5的博客 490

数据结构八大算法详解

任意的叶子节点小于(或大于)它所有的父节点

卫龙的博客 4334

大模型驱动时序量化因子自动优化:从WorldQuant回测到实战策略

本文探讨了如何利用大模型驱动时序量化因子的自动优化,构建从创意生成到实战验证的完整流程。通过结合WorldQuant回测平台,搭建自动化流水线,详细拆解了因子生成、回测验证与迭代优化的核心模块。文章分享了从初版实现到进阶优化的实践经验,并指出提示词工程与领域知识注入是关键,旨在实现人机智能协作,提升量化策略研发效率。

wdx012345的博客 803

数据结构

数据结构1.数组2.栈3.队列4.堆5.哈希表6.树7.链表8.图 数据结构一共有八种,数组,栈,堆,哈希表,链表,树,队列和图 1.数组 int [ ] a =new int[10];data[0] = 1; 优点: 1、按照索引查询元素速度快 2、按照索引遍历数组方便 缺点: 1、数组的大小固定后就无法扩容了 2、数组只能存储一种类型的数据 3、添加,删除的操作慢,因为要移动其他的元素。 适...

qq_39949570的博客 941

详解Σ-Δ型ADC拓扑结构的基本原理

现在,总环路滤波器的H(f)具有更大的滚降,Mod 2型的噪声传递函数具有40 dB/十倍频程的上升速率。同样,当正弦波输入为负满量程时,+1和–1之间的转换会减少,输出以–1为主。噪声传递函数是一个高通滤波器函数,提供噪声整形,在DC附近的较低频率,对量化噪声有很强的抑制。H(f)是环路滤波器的函数,定义噪声和信号的传递函数。Σ-Δ型ADC的噪底由热噪声决定,而不受量化噪声的限制。量化噪声为量化器的输入与输出之差。图5. Mod 1 Σ-Δ环路的线性模型(b),包括方程、滤波器、信号和噪声传递函数图。

qq_43416206的博客 1810

LSTM预测股票数据---数据预处理

# 导入相应的模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow as tf # 获取训练集 def get_train_data(data,batch_size = 60 ,time_step = 20,train_begin = 0,train_end = 58...

qq_35358021的博客 3360

数据结构常用的算法

冒泡排序,快速排序,插入排序,选择排序 遍历查找,拆半(二分)查找,分块查找

weixin_55530858的博客 1万+

python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常...

weixin_39927158的博客 1164

数据结构与算法学习笔记

本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏。有不懂的地方指出来,我做修改。 数据结构与算法思维导图 数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。 数据结构是为算法服务的,算法是要作用再特定的数据结构上的。 最常用的数据结构预算法: 数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树 算法: 递归...

ityqing的博客 35万+

基于Simulink的间接功率控制的矩阵变换器

通过上述步骤,我们成功设计并实现了基于 Simulink 的间接功率控制的矩阵变换器仿真模型。该模型能够通过控制输入电流和输出电压,实现对功率的间接控制,适用于电机驱动、可再生能源系统、电力传输等领域。通过虚拟场景仿真、参数优化和性能评估,验证了系统的稳定性和高效性,并通过调整 PI 控制器参数和优化调制算法,进一步提升了系统的性能。

MHD0815的博客 296

Python爬虫实战教程:如何高效爬取税务局通知通告

税务局发布的通知通告包含政策法规、办税指南、公告信息等,是纳税人、企业合规经营的重要参考。官网发布频率高,手动查看不便,自动爬取并保存,方便信息及时掌握及历史数据归档。本文以合法合规的方式示范,建议实际应用前确认目标网站允许爬取的范围和方式。建议使用pandas进行数据清洗,如去重、空值处理等。对于研究税务政策、进行大数据分析、搭建行业信息平台,爬取税务局通知通告信息尤为关键。公告列表以分页形式展现,包含标题、发布时间和详情页链接。进行政策趋势图、发布频率统计等可视化。爬取公开数据时,务必遵守网站的。

2201_76125261的博客 1781

数据结构和算法

java数据结构和算法

hxs214的博客 5349

YOLO26涨点改进 | YOLO联合Mamba火热发论文改进篇 | CVPR 2025 | 引入EfficientViM 新型轻量级视觉Mamba,高效捕捉全局依赖,含二次创新、适合目标检测任务

本文提出EfficientViM,一种基于HSM-SSD的新型轻量级视觉Mamba架构,用于改进YOLO26目标检测模型。该模块通过压缩隐藏状态、多阶段特征融合和内存优化设计,在降低计算复杂度的同时提升检测精度。实验表明,EfficientViM在ImageNet-1K上实现了最佳的速度-精度平衡,相比SHViT模型性能提升0.7%且速度更快。文章详细介绍了模块原理、网络结构、核心代码实现及YOLO26集成方法,提供两种改进方案,适用于资源受限环境下的实时目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 176

《算法和数据结构》数据结构篇

蓝桥杯你必须学会的算法

英雄哪里出来 4万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构与算法

数据结构与算法 1.数据结构的概念 数据结构指的是一组数据的存储结构。 2.算法的概念 算法是指操作数据的一组方法 3.二者的关系 数据结构是为算法服务的,而算法要作用在特定的数据结构上。 4.最常用的数据结构预算法 数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Tire树 算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 一、算法的复杂度 1.1大O复杂度表示法: T(n)=O(f(n)). 其中T(n)表示代码执行的时间;n表示数据规

m0_52397715的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python数据结构与算法总结

python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: 《数据结构和算法对python意味着什么?》 《顺序表数据结构在python中的应用》 《python实现单向链表数据结构及其基本方法》 《python实现单向循环链表数据结构及其方法》 《python实现双向链表基本结构及其基本方法》 《python实现双向循环链表基本结构及其基本方法》 《py...

python之战 2万+

数据结构和算法:什么是数据结构,什么是算法

文章标题前言 前言   这几天在复习数据结构的

undefinedUser_1的博客 4870

数据结构与算法 - 数据结构与算法进阶

本文介绍了常见数据结构(列表、栈、队列、链表、哈希表、树等等)与经典算法的例题及其实现方式

xian_x_的博客 2801

数据结构及算法概述

​ 所谓的数据结构指的是用于研究数据元素之间的逻辑关系和存储关系,在对数据结构的定义中需要表示整个数据结构中的数据元素集合和数据元素之间的关系集合;​ 其中:D 表示数据元素集合;R 表示数据元素之间的关系集合;注意:​ 在运算过程中,具体运算的实现:​ 运算逻辑由逻辑结构决定;​ 具体实现算法由存储结构决定。​ 所谓的算法(Algorithm),指的是一个有穷规则(或语句、指令)的有序集合。​ 它确定了解决某一问题的一个运算序列。

weixin_65477256的博客 2759

数据结构与算法——数据结构和算法的关系和区别

数据结构和算法是计算机科学中两个重要的概念,它们在软件开发和问题解决中起着关键的作用。虽然它们经常一起提到,但它们之间存在明显的区别。

Itmastergo的博客 3641

数据结构-数据结构的算法

什么是算法呢?算法是描述解决问题的方法。算法(Agorithm)这个单词最早出现在波斯数学家阿勒·花刺子密在公元825年(相当于我们中国的唐朝时期)所写的《印度数字算术》中。如今普遍认可的对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。刚才的例子我们也看到,对于给定的问题,是可以有多种算法来解决的。那我就要问问你们,有没有通用的算法呀?这个问题其实很弱智,就像问有没有可以包治百病的药呀!

weixin_71098527的博客 1383

数据结构、算法、程序的关系

这里写目录标题初衷数据结构、算法、程序的联系 初衷    数据结构、算法、程序的联系 数据结构 = 数据 + 结构 算法 = 算 + 法 程序 = (流)程 + (顺)序 反爬虫措施,读者略过: 转载请标明转自:https://leejason.blog.youkuaiyun.com/article/details/106466258 ...

郑德帅 8721

算法与数据结构

算法与数据结构,包括:大O表示法、线性结构、链式结构、队列和栈、哈希表、递归与栈、查找、排序、树(Tree)、堆(heap)、二叉查树BST)

欢迎来到三水编程的博客 1933
上一篇: 图型(Graph)结构
Everglow200
博客等级 码龄6年 12粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值