数据结构与算法之—数组(二)

本文介绍在实际工作中如何高效地处理有序数组,包括求交集、并集和合并等操作,并通过具体的公交项目案例展示了这些算法的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际上下面几个数组操作在实际工作中都有一些应用的:
就拿求两个有序数组的集合的交集来说, 我之前在一家公司呆过,做过短时间的公交项目,其公交换乘算法就,用到了有序整数集合求交的方法,在我未接触公交项目时还以为是什么图的相关算法,跟我想法大相径庭,确实没必要用图的相关算法,有更为简便和高效的算法。
 就最简单讲下,最简单的情况吧,把每个站点经过的线路的ID有序排列,那么要求两个站点的公交的线路ID的交集就行了,而他们是有序的,其复杂度是0(n),很巧妙吧,
再复杂的就是要换乘了,也就是前一个站点存放了,这个站周边的下一站的站点的索引,这也依次一个一个网下找,找到有交集的就是一个通路,其实最小换乘,最短距离都是
后面才算的,不是想象的什么最短路径之类的高复杂度算法哈。
 合并有序数组,实际工作也比较常用,尤其在在内存不够的情况下,要分开排序再合并,这类东西在搜索日志处理的时候会经常用的哈


#include<iostream>
using namespace std;


//合并两个有序数组

int* merg(int a[], int n, int b[], int m)
{
	int i = 0;
	int j = 0;
	int k = 0;
	int *c = new int[m+n];
	if (c==NULL)
	{
		return NULL;
	}

	while(i < n && j < m)
	{
		if(a[i] < b[j])
		{
			c[k++] = a[i++];
		}
		else
		{
			c[k++] = b[j++];
		}
	}

	while(i < n)
	{
		c[k++] = a[i++];
	}
	
	while(j < m)
	{
		c[k++] = b[j++];
	}

	return c;
}

//求两个有序数组集合的交集

int common_element(int a[], int n, int b[], int m, int c[])
{
	int i = 0;
	int j = 0; 
	int k = 0;
	int count = 0;
	while(i < n && j < m)
	{
		if(a[i] < b[j])
		{
			i++;
		}
		else if(a[i] == b[j])
		{
			c[k++] = a[i];
			i++;
			j++;
			count++;
		}
		else
		{
			j++;
		}
	}

	


	return count;
}

//求两个有序数组的并集

int union_element(int a[], int n , int b[], int m, int c[])
{
	int i = 0; 
	int j = 0;
	int k = 0;
	int count = 0;
	while(i < n && j < m)
	{
		if(a[i] < b[j])
		{
			c[k++] = a[i++];
			count++;
		}
		else if(a[i] == b[j])
		{
			c[k++] = a[i];
			i++;
			j++;
			count++;
		}
		else
		{
			c[k++] = b[j++];
			count++;
		}
	}

	while(i < n)
	{
		c[k++] = a[i++];
		count++;
	}

	while(j < m)
	{
		c[k++] = b[j++];
		count++;
	}

	return count;

}

int main()
{
	int a[5] = {0, 1, 2, 3, 5};
	int b[5] = {0, 2, 3, 4, 5};
	int *p = merg(a, sizeof(a)/sizeof(a[0]), b, sizeof(b)/sizeof(b[0]));
	for(int i = 0; i < sizeof(a)/sizeof(a[0]) + sizeof(b)/sizeof(b[0]); i++)
	{
		cout<<p[i]<<' ';
	}
	cout<<endl;

	int len = sizeof(a)/sizeof(a[0]) > sizeof(b)/sizeof(b[0]) ? sizeof(a)/sizeof(a[0]) : sizeof(b)/sizeof(b[0]);
	int *c = new int[len];
	memset(c, 0, len*sizeof(int));
	int count = common_element(a, sizeof(a)/sizeof(a[0]), b, sizeof(b)/sizeof(b[0]), c);
	for(int j = 0; j < count; j++)
	{
		cout<<c[j]<<' ';
	}
	cout<<endl;

	int *union_array = new int[sizeof(a)/sizeof(a[0]) + sizeof(b)/sizeof(b[0])];
	count = union_element(a, sizeof(a)/sizeof(a[0]), b, sizeof(b)/sizeof(b[0]), union_array);
	for(int k = 0; k < count; k++)
	{
		cout<<union_array[k]<<' ';
	}
	cout<<endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值