数据结构与算法之—数组(二)
2012-07-22 14:18
375 查看
实际上下面几个数组操作在实际工作中都有一些应用的:
就拿求两个有序数组的集合的交集来说, 我之前在一家公司呆过,做过短时间的公交项目,其公交换乘算法就,用到了有序整数集合求交的方法,在我未接触公交项目时还以为是什么图的相关算法,跟我想法大相径庭,确实没必要用图的相关算法,有更为简便和高效的算法。
就最简单讲下,最简单的情况吧,把每个站点经过的线路的ID有序排列,那么要求两个站点的公交的线路ID的交集就行了,而他们是有序的,其复杂度是0(n),很巧妙吧,
再复杂的就是要换乘了,也就是前一个站点存放了,这个站周边的下一站的站点的索引,这也依次一个一个网下找,找到有交集的就是一个通路,其实最小换乘,最短距离都是
后面才算的,不是想象的什么最短路径之类的高复杂度算法哈。
合并有序数组,实际工作也比较常用,尤其在在内存不够的情况下,要分开排序再合并,这类东西在搜索日志处理的时候会经常用的哈
就拿求两个有序数组的集合的交集来说, 我之前在一家公司呆过,做过短时间的公交项目,其公交换乘算法就,用到了有序整数集合求交的方法,在我未接触公交项目时还以为是什么图的相关算法,跟我想法大相径庭,确实没必要用图的相关算法,有更为简便和高效的算法。
就最简单讲下,最简单的情况吧,把每个站点经过的线路的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; }
相关文章推荐
- 数据结构与算法学习笔记之 从0编号的数组
- 【数据结构与算法】数组应用1:矩阵乘法(Java实现)
- JavaScript数据结构与算法——数组详解(下)
- 【数据结构与算法基础】以数组实现的循环队列 / Circular Queue implemented by array
- C语言 数据结构之连续存储数组的算法
- 数据结构与算法之动态数组实现堆栈
- 【数据结构与算法】数组和单链表转平衡二叉树
- 数据结构与算法1:数组1
- 数据结构与算法2——数组
- 数据结构与算法2:字符串与数组
- 数据结构数组相关算法和螺旋,蛇形,拉丁矩阵的实现
- Java数据结构与算法之数组排序——奇偶排序
- 【数据结构与算法】数组应用2:矩阵转置(Java实现)
- 数据结构与算法之数组
- 数据结构与算法:数组(一)
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 数据结构与算法--子数组和为k
- Javascript数据结构与算法---数组
- 数据结构——算法之(025)( 求一个数组的最长递减子序列)
- 数据结构——算法之(034)(编写一个函数求一个数组中的第二大数)