求一个在数组中找重复前缀的算法

hanyuwei0 2015-10-27 03:54:49
问题是这样的,我有一个数组,里面存了很多个路径名。比如array
[
C:\opt\public\technology
C:\opt\public\technology\epp
C:\opt\public\technology\epp\epp_build
...
]
我把这些路径名都排序好,现在要首先把父目录都过滤掉,比如上面3个路径只保留C:\opt\public\technology\epp\epp_build
这样的算法怎么设计执行起来最快,现在我是两个for循环。这样当数组很大的时候执行起来非常耗时间,有没有更快速的遍历方法

for(int i=0;i< len;i++)
{
array[i]
for(int j=i;j<len;j++)
if( array[j] 去掉最后部分 hasprefix (array[i]))
{
过滤掉array[i]
}
}

...全文
221 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-10-28
  • 打赏
  • 举报
回复
先不要追求快,先追求对各种边界、极端、特殊的输入都能得到正确的输出。
赵4老师 2015-10-28
  • 打赏
  • 举报
回复
算法描述和可实际使用的代码之间最大的差异就在对各种特殊数据的细节处理中。 知道折半查找算法和可实际使用的折半查找代码之间相隔了多少年吗? 花点心思构造几组特殊的测试数据吧! 比如: 空数组 一个元素的数组 两个元素的数组且其值完全相同 空字符串 带汉字的字符串 ……
hanyuwei0 2015-10-27
  • 打赏
  • 举报
回复

for(int i=0;i< len;i++)
{
  array[i]
  for(int j=i;j<len;j++)
     if( array[j] 去掉最后部分  hasprefix (array[i]))
       {
           过滤掉array[i]
       }
}
对于已经排序的路径来说,我是不是可以不用两个for循环,只要判断array[i]和array[i+1]就了 比如这样的数组 [C:\opt\public\technology C:\opt\public\technology2\epp C:\opt\public\technology2\epp\epp_build] 如果C:\opt\public\technology2\epp不满足的话,那C:\opt\public\technology2\epp\epp_build就更不满足了。 但实际输出好像不对,谁能举出个反例来吗?

for(int i=0;i< len;i++)
{
    if( array[j] 去掉最后部分  hasprefix (array[i+1]))
       {
           过滤掉array[i]
       }
}
hanyuwei0 2015-10-27
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
都排序好的话,map都不用,使用自定义sort方法的unique即可:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
bool myfunction(string a, string b) {
  return (a.find(b)==0);
}
int main () {
  string mystrs[5] = {
    "C:\\opt\\public\\technology\\epp\\epp_build",
    "C:\\opt\\public\\technology\\epp",
    "C:\\opt\\public\\technology",
    "D:\\opt\\technology",
    "D:\\opt",            
  };
  vector<string> myvector (mystrs,mystrs+5);
  vector<string>::iterator it;
  it=unique(myvector.begin(), myvector.end(), myfunction);
  myvector.resize(distance(myvector.begin(),it) );
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << *it <<endl;
  return 0;
}
//C:\opt\public\technology\epp\epp_build
//D:\opt\technology
//
unique这个能换成算法吗?因为我不是用C++写
fly_dragon_fly 2015-10-27
  • 打赏
  • 举报
回复
赵4老师 终于用cout了, 教材应该用C++11之后的
赵4老师 2015-10-27
  • 打赏
  • 举报
回复
都排序好的话,map都不用,使用自定义sort方法的unique即可:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
bool myfunction(string a, string b) {
  return (a.find(b)==0);
}
int main () {
  string mystrs[5] = {
    "C:\\opt\\public\\technology\\epp\\epp_build",
    "C:\\opt\\public\\technology\\epp",
    "C:\\opt\\public\\technology",
    "D:\\opt\\technology",
    "D:\\opt",            
  };
  vector<string> myvector (mystrs,mystrs+5);
  vector<string>::iterator it;
  it=unique(myvector.begin(), myvector.end(), myfunction);
  myvector.resize(distance(myvector.begin(),it) );
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << *it <<endl;
  return 0;
}
//C:\opt\public\technology\epp\epp_build
//D:\opt\technology
//
hanyuwei0 2015-10-27
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
map<string>
大哥能再详细点么
赵4老师 2015-10-27
  • 打赏
  • 举报
回复
map<string>
lm_whales 2015-10-27
  • 打赏
  • 举报
回复
树?目录树?
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查、插值查、斐波那契查、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧