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

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]
}
}

...全文
229 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
树?目录树?

3,882

社区成员

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

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