提出这个问题似乎有点尴尬,但我仍然在努力寻找自己的答案。
我有一系列元素,其中有几个是重复的。例如:
list = [ '1' , '2' , '3' , '1' , '4' , '5' , '3' ]
可以看出," 1"和" 3"存在两次。现在我想定制它,使它"清洁"。这就是我经常做的事情:
//Create a new list
listCustomize = []
for element in list:
//Check if element already in listCustomize or not, if yes, dont add it
if element not in listCustomize:
listCustomize.append(element)
通过这种方式,我可以拥有一个自定义
的新阵列listCustomize = [ '1' ,'2' , '3' , '4' , '5' ]
所以问题在于,我的原始数组包含数十万个元素。因此程序非常慢。
可能有人建议对此问题采取更复杂的方法吗?我正在考虑使用多线程,或使用数据库来存储原始数组....
注意:什么样的编程语言不是问题。但更喜欢Perl / Python / Java / C ++
谢谢你,并致以最诚挚的问候。
亚历
答案 0 :(得分:0)
我认为在这种情况下使用散列会有所帮助。因为在散列中搜索是 O(1)。
如果我使用的是Java,那么每当我在新列表中插入一个元素时,我也会将该元素存储在一个hashmap中。这样做的原因是我现在可以检查O(1)元素是否已经插入新列表中。因此,新列表中不会有重复项。
密钥为Integer
,值为Boolean
变量。散列图数据结构定义为:
HashMap<Integer,Boolean> hm=new HashMap<Integer,Boolean>();
创建新列表的算法如下:
for each element e in the original list
{
if(hm.get(e)==null)//CHECK IF ELEMENT IS ALREADY IN THE NEW LIST
{
add e to new list
hm.add(e,true);//INSERT NEW ELEMENT IN HASHMAP
}
}
这肯定会加快您的代码速度,因为我们能够取消重复项并在线性时间内完成工作 O(n),n是原始数组中元素的数量。
每当出现搜索问题时,散列在大多数情况下都有帮助。
答案 1 :(得分:0)
这里的问题不是使用哪种编程语言和功能。 例如,虽然你的程序将在C中运行得比在Java中快得多,但这并不是那么重要。
您需要的是对数组进行排序。对它进行排序后,在此之后只需要一个遍历数组,并且您将轻松地丢弃重复值,因为它们是一个接一个的。
您可以使用任何语言的任何Quicksort实现。 Quicksort的问题是当超过50%的数组已经排序时它会变慢。最佳案例复杂度为O(n log n),最差情况为O(n ^ 2)。
许多排序实现首先通过数组并确定数组已经排序的程度,然后选择Quicksort,如果数组的排序低于一定程度,例如,Straight Insertion则排序。
嗯,是的,还有一个问题是哈希方法是否更快或更快,因为哈希方法具有O(n)的复杂性。但哈希函数需要时间来执行,并且存在冲突的可能性。在这种情况下,最好的方法是制定几种不同方法的基准。散列方法的执行时间是O(n)* time_to_exec_one_hash。排序方法的执行时间是O(n log n)* time_to_exec_one_iteration。第二种方法总是更快,直到一定数量的元素n。
此外,根据所使用的语言和方法,如何实现向哈希/排序结果添加新元素可能存在其他隐藏的复杂性。
答案 2 :(得分:-1)
在python中,设置a = set()
等数据结构可以解决这个问题。