经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
数据结构与算法:线性表——删除重复元素
来源:cnblogs  作者:1000sakura  时间:2018/9/25 20:38:41  对本文有异议

线性表是一种随机存取的结构,和链表不同,链表顺序存取的结构。但是,线性表是一种顺序存储的结构,而链表是链式存储结构。两者都是线性的,但区别不同。

 

进入主题:

1.假如有一串数据元素,要求删除其中的重复元素。

首先想到的是用两层循环,第一层从第一个元素开始,第二层从第一层元素的下一个元素开始。

就是假如第一层是ai元素,则第二层就为ai+1元素。

函数实现:

  1. 1 void Purge1(ElemType A[],int &n){//ElemType表示任意数据类型,以后不再说明//n为线性表的长度
  2. 2
  3. 3   int i=0,j;
  4. 4
  5. 5   while(i<n){
  6. 6
  7. 7     j=i+1;
  8. 8
  9. 9     while(j<n){
  10. 10
  11. 11       if(A[j]==A[i])
  12. 12
  13. 13         Deletelist(A,n,j+1);//具体函数实现最后给出
  14. 14
  15. 15       else
  16. 16
  17. 17         j++;
  18. 18
  19. 19     }
  20. 20
  21. 21     i++;
  22. 22
  23. 23   }
  24. 24
  25. 25 }

 

2.如果这些元素是按递增排列,且数据量很大的话,使用上面的算法就会造成时间上的浪费。

那要怎么优化呢?

函数实现:

  1. 1 void Purge2(int *A, int &n) {
  2. 2   int i = 0, k = 0;//k是重复的次数
  3. 3   for (i = 0; i < n - 1; i++)
  4. 4     if (A[i] != A[i + 1])
  5. 5       A[i-k+1] = A[i + 1];
  6. 6     else
  7. 7       k++;
  8. 8   n = n - k;
  9. 9 }

 

经过小规模的测试没有发现问题。若有有问题可以提出。

经过两函数的分析,可以看出第一个函数使用的是两层循环,而第二个函数只使用了一层循环达到了效果。

避免了不必要的时间浪费。

 

附上Deletelist函数:

  1. 1 void Deletelist(int *A, int &n, int i) {
  2. 2   int j;
  3. 3   if (i<1 || i>n)//这条可以无视
  4. 4     cout << "超出范围!";
  5. 5   for (j = i; j < n; j++)
  6. 6     A[j - 1] = A[j];
  7. 7   n--;
  8. 8 }

 

碎碎念:本人学生,第一次写随笔,也不清楚下次会在什么时候写。如果有什么需要改进的地方,请务必提出来,我在此谢过。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号