您的位置:首页 > 理论基础 > 数据结构算法

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

2012-07-22 14:18 375 查看
实际上下面几个数组操作在实际工作中都有一些应用的:

就拿求两个有序数组的集合的交集来说, 我之前在一家公司呆过,做过短时间的公交项目,其公交换乘算法就,用到了有序整数集合求交的方法,在我未接触公交项目时还以为是什么图的相关算法,跟我想法大相径庭,确实没必要用图的相关算法,有更为简便和高效的算法。

就最简单讲下,最简单的情况吧,把每个站点经过的线路的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: