如何快速从某大数组中过滤掉与某小数组中重复的数据?

ZhouQiang 2005-06-14 11:27:06
如何快速从某大数组中过滤掉与某小数组中重复的数据?

大数组:int ArrayB[] = {99, 88,1, 2, 3, 4, 5, 99,88 6, 7, 8, 9, 0, 99, 97} ;
小数组:int ArrayL[] = {99, 88} ;

如何
得到: int ArrayT[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 99, 97} ;
...全文
169 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhouQiang 2005-06-14
  • 打赏
  • 举报
回复
//我程序中的定义如下,主要是想找到一个更为快速的方法
//类似Replace("你好中国你好", "你好", "")
//但并非Replace那样简单,不是替换字符串

//已知大vector 包含语音数据----"你好中国你好"
vector <UCHAR> vecDemoData ;

//已知小vector 包含语音数据----"你好"
vector <UCHAR> vecMakeData ;

//求vector 需要生成包含语音数据----"中国"
vector <UCHAR> vecTempData ;
YanDong_8212 2005-06-14
  • 打赏
  • 举报
回复
建议使用链表,如果用数组,数据的移动量太大.使用链表只需两个循环,主循环是遍历小链表,副循环遍历大链表,只要发现元素重复就断链修改.算法时间复杂度是nA*nB
newbiestar 2005-06-14
  • 打赏
  • 举报
回复
回复人: artmouse(艺术老鼠) ( ) 信誉:100 2005-06-14 12:13:00 得分: 0


那你想办法用汇编来写吧,可以提高一些速度的。


=================================================
明摆着这是一个算法的问题,不要把汇编牵扯进来,好的C/C++代码效率可以达到asm的80%~90%,但是一个好的算法的速度可以达到坏算法的几十倍……
newbiestar 2005-06-14
  • 打赏
  • 举报
回复
代价是额外的一点空间。不过如果你的元素全都是int的话,那还是自己找个好点的hash函数吧,int的空间(你要是删除10000的话,至少要创建一个大小为10000的数组……)这里肯定耗不起……
artmouse 2005-06-14
  • 打赏
  • 举报
回复
那你想办法用汇编来写吧,可以提高一些速度的。

newbiestar 2005-06-14
  • 打赏
  • 举报
回复
……

也不是没有办法,但是如果对于int似乎代价太高了。如果是char的话,可以创建一个256大小的数组,然后把小数组里面出现的东西对应在256数组里面的值标记为1,只要寻找的时候发现了这个,就可以把这个元素去掉(好方法是做一个标记,然后重新创建空间把不会被删掉的东西放进去)。

其实这个就是利用了hash的思想,这样比你线形叠代要快一些,叠代的时间复杂度是sizeof(ArrayB)/sizeof(ArrayB[0])*sizeof(ArrayL)/sizeof(ArrayL[0]),而这样的方法时间复杂度就减小到了sizeof(ArrayB)/sizeof(ArrayB[0])了
ZhouQiang 2005-06-14
  • 打赏
  • 举报
回复
对速度要求很高,应用到过滤一个大语音文件中包含的某些语音。
artmouse 2005-06-14
  • 打赏
  • 举报
回复
大的一个一个和小数组里面的比,一样就删除吧。。

newbiestar 2005-06-14
  • 打赏
  • 举报
回复
只能对小的数组进行排序……
ZhouQiang 2005-06-14
  • 打赏
  • 举报
回复
不能用sort,一sort语音数据就乱套了.
goodboyws 2005-06-14
  • 打赏
  • 举报
回复
呵呵,上面的算法比较适合a,b长度关系不确定时.
goodboyws 2005-06-14
  • 打赏
  • 举报
回复
排序,挨个找
sort(a)
sort(b)
int i=0;
int j=0;
while(i<len(a) && j<len(b))
{
if (a[i] < b[j])
i++;
else if (a[i] > b[j])
j++;
else
{
//去重
}
}
xiao_xiao_zi 2005-06-14
  • 打赏
  • 举报
回复
查找匹配算法
请参考KMP
效率要比叠代高些
liuyan4794 2005-06-14
  • 打赏
  • 举报
回复
学习
ZhouQiang 2005-06-14
  • 打赏
  • 举报
回复
//下面是我在C#中的实现,但现在我想用C++实现

//------------------------------------------------------------------------
// 语音合成处理函数
public static string TextToSpeech(string VocText)
{
//初始化
...

//变量
string strDemo = "你好" ;
string strMake = "你好中国你好" ;
string wavDemo = Application.StartupPath + "\\Demo.wav" ;
string wavMake = Application.StartupPath + "\\Make.wav" ;
string wavFinal = Application.StartupPath + "\\Final.wav" ;

//删除临时文件
...

//生成演示语音
TxtToWav(strDemo, wavDemo) ;

//生成合成语音
TxtToWav(strMake, wavMake) ;

//演示语音
FileStream fsDemo = new FileStream(wavDemo, FileMode.Open) ;
BinaryReader brDemo = new BinaryReader(fsDemo) ;
byte[] ByteArrayTitle = new byte[44] ;
fsDemo.Seek(0, SeekOrigin.Current) ;
ByteArrayTitle = brDemo.ReadBytes(44) ;
int LengthDemo = (int)fsDemo.Length - 44 ;
byte[] ByteArrayDemo = new byte[LengthDemo] ;
fsDemo.Seek(44, SeekOrigin.Current) ;
ByteArrayDemo = brDemo.ReadBytes((int)fsDemo.Length - 44) ;
fsDemo.Close() ;

//生成语音
FileStream fsMake = new FileStream(wavMake, FileMode.Open) ;
BinaryReader brMake = new BinaryReader(fsMake) ;
int LengthMake = (int)fsMake.Length - 44 ;
byte[] ByteArrayMake = new byte[LengthMake] ;
fsMake.Seek(44, SeekOrigin.Current) ;
ByteArrayMake = brMake.ReadBytes((int)fsMake.Length - 44) ;
fsMake.Close() ;

//以字符串形式替换生成语音中的部分语音
string tmpDemo = Encoding.Unicode.GetString(ByteArrayDemo) ;
string tmpMake = Encoding.Unicode.GetString(ByteArrayMake) ;
string strFinal = tmpMake.Replace(tmpDemo, "") ;

//最终语音
FileStream fsFinal = new FileStream(wavFinal, FileMode.Create) ;
BinaryWriter bwValue = new BinaryWriter(fsFinal) ;
//00-03
fsFinal.Write(ByteArrayTitle, 0, 4) ;
//04-07
bwValue.Write(strFinal.Length * 2 + 36) ; //08-39
fsFinal.Write(ByteArrayTitle, 8, 32) ; //40-43
bwValue.Write(strFinal.Length * 2) ;
//Vioce Data
byte[] ByteArrayFinal = Encoding.Unicode.GetBytes(strFinal) ;
//44-->
fsFinal.Write(ByteArrayFinal, 0, ByteArrayFinal.Length) ; fsFinal.Close() ;

//结束
...

return wavFinal ;
}
newbiestar 2005-06-14
  • 打赏
  • 举报
回复
还有个办法,就是对小数组排序,然后对大数组叠代,在小数组中查找是否存在大数组中的成员,因为小数组排序过了,所以可以采用二分查找,速度还是比较快的,数据量稍大情况下,复杂度的减小更加明显(不过还是没办法达到hash的复杂度……)
newbiestar 2005-06-14
  • 打赏
  • 举报
回复
这种问题不利用hash的思想必然要导致效率的低下……

而且对vector重复调用remove肯定也是效率低下的……
miladuo 2005-06-14
  • 打赏
  • 举报
回复
一个一个的比较吧

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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