如何使用CopyMemory删除数组中重复的元素

m60a1 2009-05-25 08:41:56
加精
有一个数组很大,接近2万左右,现在需要从这个数组中,把重复的元素删除后,重新打印这个数组!

循环太耗CPU了!!!效率太低了!
...全文
2000 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 91 楼 的回复:]

#region 删除数组重复元素
/// <summary>
/// 删除数组重复元素
/// </summary>
/// <param name="data">数组</param>
/// <returns></returns>
public static string[] GetN……
[/Quote]
dddddddddddddddd
凋零的老树 2009-06-05
  • 打赏
  • 举报
回复
#region 删除数组重复元素
/// <summary>
/// 删除数组重复元素
/// </summary>
/// <param name="data">数组</param>
/// <returns></returns>
public static string[] GetNoReArray(string[] data)
{
List<string> list = new List<string>();
foreach (string temp in data)
{
if (!string.IsNullOrEmpty(temp) && !list.Contains(temp))
{
list.Add(temp);
}
}
return list.ToArray();// .ToArray(typeof(string));
}
#endregion
yangzn76 2009-06-04
  • 打赏
  • 举报
回复
其实VB的集合插入数据并不慢,只是你不能用索引去读,不然很慢,要用Key 才快
你可以看看: \www.vbaccelerator.com\home\VB\Code\Techniques\A_Fast_Index-Based_Object_Collection\article.asp.htm

它的测试结果是: 不过去时 Insert Read Remove 好像是用的索引,而不是用的Key
Collection Add 10,000 Insert 10,000 Read 10,000 Remove 10,000
VB Collection 116 163 7581 8277
ArrayList 146 409 52 106
m60a1 2009-06-03
  • 打赏
  • 举报
回复
楼上几位都可以的:),,不过火气大家都小点,,夏天本来就热哈:),,吹会儿空调,再继续研究:)
舉杯邀明月 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 ybh37 的回复:]
......................

Dictionary 对象与 PERL 关联数组是等价的。(微软原话) 而关联数组,又称为哈希表(hash table),也就是说,dic.Exists(a(i))可以直接定位。
[/Quote]
我想问一下这位大侠:“.....哈希表(hash table),也就是说,dic.Exists(a(i))可以直接定位”,这真是“微软原话”吗?我觉得是你自己片面的认识吧!


[Quote=引用 80 楼 Tiger_Zhao 的回复:]
我57楼的测试是将 Dictionary 的构建也计入耗时的,而哈希表通常创建比查找要慢,所以不用怀疑 Exist() 方法的速度。
[/Quote]
我知道是把构建计入耗时的。可我的方法也是把构建计入耗时的呀,要是单独比检索速度的话,我的应该比 Dictionary 更强。

  • 打赏
  • 举报
回复
可以做成1个插入排序 到新数组中 重复的不插入到新数组就行了 Nlog(N)
bluesky396 2009-06-02
  • 打赏
  • 举报
回复
学习
神马都能聊 2009-06-01
  • 打赏
  • 举报
回复
精彩至极,学习

of123 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 m60a1 的回复:]
引用 35 楼 of123 的回复:

肯定不读/写数据库,我上面的贴子上已经写明了,你数据操作优化的牛,操作时候已经不是直接操作内存中的数据
再快也快不过直接操作内存中的数据!
[/Quote]

楼主,我是该怀疑你的智力还是你的诚意?

我上面所写的,是数据写入你所谓数组的过程,而不是从已经有重复数据中重新筛选的过程。虽然你闭口不谈数据是如何写入数组的,但我猜测,你必要有这样的步骤。

如果在写入阶段就排除了重复数据,还需要“直接操作内存中的数据”吗?

对回答看也不看就稀里糊涂地下结论,无怪你进步不快。

当然,这只是一种方法论,用不用数据库抑或数组并不是问题的实质。无论用什么方法,2 W 条不重复记录的处理,在 2 秒钟的时间里是足够了。除非你钻牛角尖。
of123 2009-06-01
  • 打赏
  • 举报
回复

楼上说的不错。如果能建立哈希表的话,当然可以用空间换时间。

但问题是,对于复杂度很高的问题,空间和时间是一回事(宇宙寿命和宇宙原子数问题)。例如,你需要搜索的记录是长度为 10000 个字节的字符串,[0-9A-Za-z]组成,那需要多大的空间?

搜索空间是由值空间和记录数构成的。对于值空间很大,但记录数相对较小的问题,显然遍历更好一些。

任何问题,不要脱离实际的需求来讨论方法优劣。

到目前为止,楼主似乎都没有说清楚她的记录长度和字符串值定义域(即她的问题的值空间究竟有多大)。所以在这种比较含混的需求下,出现方法争论不奇怪。
Tiger_Zhao 2009-06-01
  • 打赏
  • 举报
回复
我57楼的测试是将 Dictionary 的构建也计入耗时的,而哈希表通常创建比查找要慢,所以不用怀疑 Exist() 方法的速度。
咸清 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 80 楼 Tiger_Zhao 的回复:]
我57楼的测试是将 Dictionary 的构建也计入耗时的,而哈希表通常创建比查找要慢,所以不用怀疑 Exist() 方法的速度。
[/Quote]
继续学习!
我认为说的有道理,Dictionary 使用的毕竟是一个通用的哈希构造函数,它在创建的时候肯定没有专门为特定的数据做的哈希构造函数效率高。没有真正的数据,细微的速度差距也不能通过我们的测试真正的反应出来。
---------------------------------------------------------------------------------------------------------------------------
个人之见。虚心向大家学习!
咸清 2009-05-31
  • 打赏
  • 举报
回复
参阅
http://www.microsoft.com/china/vbscript/vbslang/vsobjDictionary.htm
咸清 2009-05-31
  • 打赏
  • 举报
回复
所以,大家就不用怀疑dictionary的速度了。
咸清 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 72 楼 young0098 的回复:]
引用 31 楼 Chen8013 的回复:
引用 17 楼 vbman2003 的回复:
用dictionary一个循环而已...

VB code
dim dic as dictionary
Set dic = New Dictionary
For i = 0 To ubound(a)
If Not dic.Exists(a(i)) Then
dic.Add a(i), vbNullString
Print a(i)
End If
Next
只有一个循环?
请问这位大侠:
要得到dic.Exists(a(i)) 的结果,它不进行循…
[/Quote]
Dictionary 对象与 PERL 关联数组是等价的。(微软原话) 而关联数组,又称为哈希表(hash table),也就是说,dic.Exists(a(i))可以直接定位。
young0098 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 Chen8013 的回复:]
引用 17 楼 vbman2003 的回复:
用dictionary一个循环而已...

VB code
dim dic as dictionary
Set dic = New Dictionary
For i = 0 To ubound(a)
If Not dic.Exists(a(i)) Then
dic.Add a(i), vbNullString
Print a(i)
End If
Next
只有一个循环?
请问这位大侠:
要得到 dic.Exists(a(i))的结果,它不进行循环吗?

看不到并不等于…
[/Quote]

dic.Exists(a(i))就一定是循环吗?如果是循环的话,那VB的设计也太烂了!至少要用Hash树,计算出Hash值,直接定位,如果没定位到就说明不存在。
young0098 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 Chen8013 的回复:]
引用 17 楼 vbman2003 的回复:
用dictionary一个循环而已...

VB code
dim dic as dictionary
Set dic = New Dictionary
For i = 0 To ubound(a)
If Not dic.Exists(a(i)) Then
dic.Add a(i), vbNullString
Print a(i)
End If
Next


只有一个循环?
请问这位大侠:
要得到 dic.Exists(a(i))的结果,它不进行循环吗?

看不到并不等于…
[/Quote]

dic.Exists(a(i))就一定是循环吗?如果是循环的话,那VB的设计也太烂了!至少要用Hash树,计算出Hash值,直接定位,如果没定位到就说明不存在。
young0098 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 Chen8013 的回复:]
引用 17 楼 vbman2003 的回复:
用dictionary一个循环而已...

VB code
dim dic as dictionary
Set dic = New Dictionary
For i = 0 To ubound(a)
If Not dic.Exists(a(i)) Then
dic.Add a(i), vbNullString
Print a(i)
End If
Next


只有一个循环?
请问这位大侠:
要得到 dic.Exists(a(i))的结果,它不进行循环吗?

看不到并不等于…
[/Quote]

dic.Exists(a(i))就一定是循环吗?如果是循环的话,那VB的设计也太烂了!至少要用Hash树,计算出Hash值,直接定位,如果没定位到就说明不存在。
of123 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 ybh37 的回复:]
引用 48 楼 fzx4936 的回复:

当然没有本地处理快了,只是用函数打包了一些操作显得简单而已。
[/Quote]

这位大侠并没有看懂我的意思。你所说的“本地处理”是剔除重复的数据。

而我建议的,是当初就不把重复数据赋值进来。无论如何,你的方法也避免不了初始赋值。如果数据生成及赋值过程并不是非常快的话,选择性地赋值几乎不占用额外的时间。当且数据库引擎是自动处理排队的,一般不会造成数据丢失。这样的话,根本就没有必要进行后续的你所说的“本地处理”了。你再快,也快不过不需要处理吧?
加载更多回复(70)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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