![]() |
1
18
怎么样:
应该是o(n^2)或更小。 |
![]() |
2
132
我女朋友建议的解决方案是合并类型的变体。唯一的修改是在合并步骤中,忽略重复的值。这个解决方案也是O(n log n)。在这种方法中,将排序/重复删除结合在一起。不过,我不确定这是否有什么区别。 |
![]() |
3
45
我以前发布过一次,但是我会在这里复制它,因为它很酷。它使用散列,在适当的地方构建类似散列集的东西。它保证在腋窝空间中是O(1)(递归是一个尾部调用),并且通常是O(n)时间复杂性。算法如下:
这可以证明是O(N),前提是散列中没有病理场景:即使没有重复,在每次递归中大约会消除2/3的元素。每一级递归都是O(n),其中small n是剩余元素的数量。唯一的问题是,在实践中,它比快速排序慢,当有很少的重复,即大量的碰撞。然而,当有大量的副本时,它的速度是惊人的快。 编辑:在当前的D实现中,哈希T是32位。关于这个算法的所有内容都假定在完整的32位空间中只有很少的哈希冲突(如果有的话)。然而,碰撞可能经常发生在模空间中。然而,对于任何合理大小的数据集,这个假设都很可能是正确的。如果密钥小于或等于32位,它可以是自己的哈希,这意味着在整个32位空间中不可能发生冲突。如果它更大,您就无法将它们中的足够多放入32位内存地址空间中,使其成为一个问题。我假设在D的64位实现中,散列值将增加到64位,数据集可以更大。此外,如果事实证明这是一个问题,那么可以在每个递归级别上更改哈希函数。 下面是D编程语言的一个实现:
|
![]() |
4
20
更有效的实施
在这个实现中,不需要对数组进行排序。 此外,如果发现重复的元素,则不需要将所有元素在此之后移动一个位置。 此代码的输出是大小为newLength的数组[] 这里我们从数组中的第二个元素开始,并将其与数组中的所有元素进行比较,直到这个数组为止。 我们保存了一个额外的索引变量“newlength”,用于修改输入数组。 newlength variabel初始化为0。 数组[1]中的元素将与数组[0]进行比较。 如果它们不同,则数组[newlength]中的值将使用数组[1]进行修改,并增加newlength。 如果它们相同,则不会修改newLength。 所以如果我们有一个数组[1 2 1 3 1], 然后 在“j”循环的第一个循环中,将数组[1](2)与数组0进行比较,然后将2写入数组[newLength]=数组[1] 所以数组将是[12],因为newLength=2 在“j”循环的第二遍中,数组[2](1)将与数组0和数组1进行比较。这里,因为数组[2](1)和数组0是相同的,所以这里将中断循环。 所以数组将是[12],因为newLength=2 等等。 |
![]() |
5
19
如果您正在寻找高级的O符号,那么使用O(n log n)排序对数组进行排序,然后执行O(n)遍历可能是最好的路由。如果不进行排序,您将看到O(n^2)。 编辑:如果你只是做整数,那么你也可以做基数排序得到O(N)。 |
![]() |
6
10
1。使用O(1)额外空间,在O(n log n)时间内 这是可能的,例如:
我相信EJEL的合作伙伴是正确的,这样做的最好方法是使用简化的合并步骤进行就地合并排序,这可能是问题的目的,如果您是这样的话,例如编写一个新的库函数来尽可能高效地进行合并,而没有能力改进输入,而且在某些情况下它将是有用的。在没有哈希表的情况下执行此操作,具体取决于输入的种类。但我还没检查过这个。 2。在O(n)时间内使用O(大量)额外空间
这仅在以下几个可疑假设成立时有效:
这是一个错误的答案,但是如果你有很多输入元素,但是它们都是8位整数(或者甚至可能是16位整数),这可能是最好的方法。 三。O(小)ish额外空间,O(n)ish时间 作为2,但使用哈希表。 4。清晰的道路 如果元素的数目很小,那么如果其他代码写得更快、读得更快,那么编写适当的算法就没有用处。 例如,遍历数组中每个唯一的元素(即第一个元素、第二个元素(第一个元素的副本已删除)等),删除所有相同的元素。o(1)额外空间,o(n^2)时间。 使用能做到这一点的库函数。效率取决于你容易得到的东西。 |
![]() |
7
7
嗯,它的基本实现非常简单。检查所有元素,检查其余元素是否重复,并将其余元素移到它们上面。 它的效率非常低,您可以使用辅助数组来加速输出或排序/二进制树,但这似乎是不允许的。 |
![]() |
8
6
如果愿意牺牲内存,可以在一次遍历中完成。您可以简单地计算在哈希/关联数组中是否看到整数。如果您已经看到一个数字,请在移动时将其删除,或者更好地说,将您没有看到的数字移动到新数组中,避免在原始数组中发生任何移动。 在Perl:
|
![]() |
9
5
如果允许使用C++,则调用
如果C++是不存在的,没有任何东西可以阻止这些相同的算法在C中被写入。 |
![]() |
10
5
函数的返回值应该是唯一元素的数目,它们都存储在数组的前面。如果没有这些额外的信息,您甚至不知道是否有任何重复。 外循环的每个迭代处理数组的一个元素。如果它是唯一的,它将保持在数组的前面;如果它是重复的,它将被数组中最后一个未处理的元素覆盖。此解决方案在O(n^2)时间内运行。
|
![]() |
11
4
这里是一个Java版本。
|
![]() |
12
2
显然,数组应该从右向左“遍历”,以避免来回不必要地复制值。
如果您有无限的内存,您可以为
如果不这样做,我想不出比遍历一个数组并将每个值与后面的值进行比较更好的方法,如果发现重复的值,就完全删除这些值。这是附近的地方 O(n^2) (或) O((n^ 2-n)/ 2) ) IBM有一个 article 有点接近主题。 |
![]() |
13
2
让我们看看:
|
![]() |
14
2
这是我的解决方案。
|
![]() |
15
1
在Java中,我会像这样解决它。不知道怎么用C写这个。
|
![]() |
16
1
这可以用O(n log n)算法一次完成,不需要额外的存储。
从元素开始
检查
以这种方式继续,递增
看这个例子,这不是所要求的,因为结果数组保留了原始元素顺序。但是如果这一要求得到放宽,上面的算法就应该做到这一点。 |
![]() |
17
1
下面怎么样?
我尝试声明一个临时数组,并将元素放入其中,然后再将所有内容复制回原始数组。 |
![]() |
18
1
在回顾了这个问题之后,下面是我的Delphi方法,可能会有所帮助
|
![]() |
19
1
下面的示例将解决您的问题:
|
![]() |
20
1
|
![]() |
21
1
这是幼稚的(n*(n-1)/2)解决方案。它使用恒定的额外空间并保持原始顺序。它类似于@byju的解决方案,但不使用
|
![]() |
22
0
这可以在一次传递中完成,在O(n)时间内以输入中整数的数目完成。 以唯一整数的数目列出和o(n)存储。 从前到后浏览列表,用两个指针“dst”和 “src”初始化为第一个项。从空哈希表开始 “看到的整数”。如果src处的整数不在哈希中, 将其写入DST的插槽,并递增DST。在SRC处添加整数 到散列,然后递增src。重复,直到SRC通过 输入列表。 |
![]() |
23
0
将所有元素插入
|
![]() |
24
0
使用Bloom过滤器进行哈希运算。这将大大减少内存开销。 |
![]() |
25
0
在Java中,
输出: 1、2、3、4、6、7、8、9、10_ 希望这会有帮助 |
![]() |
26
0
创建一个
|
![]() |
27
0
首先,您应该创建一个数组
这样,就可以将每个副本设置为零。所以唯一要做的就是穿过
|
![]() |
28
0
给定n个元素数组,编写一个算法,在时间o(nlogn)内从数组中删除所有重复项。
在其他元素中,使用“key”在输出数组中维护。考虑到键的长度为o(n),对键和值执行排序所用的时间为o(nlogn)。因此,从数组中删除所有重复项所用的时间是o(nlogn)。 |
![]() |
29
0
这就是我所得到的,尽管它把我们可以按升序或降序排序的顺序放错了位置。
|
![]() |
30
-1
如果你有一个好的数据结构,可以快速判断它是否包含一个整数,那就太酷了。也许是某种树。
|
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |