avatar
问一道排序题目# Programming - 葵花宝典
u*c
1
有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
唯一,有没有好的算法。只能使用O(1)的辅助空间。
O(n^2)的算法是很显然的。
avatar
P*f
2
难道不是一遍扫描O(n)?
两个index positions 分别指向就绪数组地插入位置和新candidate元素的检查位置

有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
唯一,有没有好的算法。只能使用O(1)的辅助空间。
O(n^2)的算法是很显然的。

【在 u*c 的大作中提到】
: 有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
: 要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
: 唯一,有没有好的算法。只能使用O(1)的辅助空间。
: O(n^2)的算法是很显然的。

avatar
t*t
3
数组不好插入吧,如果是双链表就没问题.但是已经说了不许换空间了.

【在 P*****f 的大作中提到】
: 难道不是一遍扫描O(n)?
: 两个index positions 分别指向就绪数组地插入位置和新candidate元素的检查位置
:
: 有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
: 要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
: 唯一,有没有好的算法。只能使用O(1)的辅助空间。
: O(n^2)的算法是很显然的。

avatar
c*d
4
O(1)没问题。一次只需要换一个元素,就在原来的数组上操作。

【在 t****t 的大作中提到】
: 数组不好插入吧,如果是双链表就没问题.但是已经说了不许换空间了.
avatar
s*e
5
换到哪儿去?

【在 c***d 的大作中提到】
: O(1)没问题。一次只需要换一个元素,就在原来的数组上操作。
avatar
k*f
6
换到最后去,做一次旋转,
i,i+1,..n, --> i+1,i+2,...,n,i
不过,得要n^2复杂度

【在 s***e 的大作中提到】
: 换到哪儿去?
avatar
P*f
7
我这个就绪数组是指原数组得已处理好部分
我觉得这题关键就是找准一个loop invariant

数组不好插入吧,如果是双链表就没问题.但是已经说了不许换空间了.

【在 t****t 的大作中提到】
: 数组不好插入吧,如果是双链表就没问题.但是已经说了不许换空间了.
avatar
c*d
8
thrust is right. If link list, insertion is O(1), thus overall complexity O(
n). If array, insertion is O(n), over all complexity is n square.
but no matter what, only O(1) extra space is needed.

【在 s***e 的大作中提到】
: 换到哪儿去?
avatar
P*f
9
why o(n) for a single insert in case of array?
could you please give a counter example?
I think when you insert one element, just overlap the previous repeated
element.
no need to move.

O(

【在 c***d 的大作中提到】
: thrust is right. If link list, insertion is O(1), thus overall complexity O(
: n). If array, insertion is O(n), over all complexity is n square.
: but no matter what, only O(1) extra space is needed.

avatar
P*f
10
en, I misunderstand the problem. forget it.

why o(n) for a single insert in case of array?
could you please give a counter example?
I think when you insert one element, just overlap the previous repeated
element.
no need to move.
O(

【在 P*****f 的大作中提到】
: why o(n) for a single insert in case of array?
: could you please give a counter example?
: I think when you insert one element, just overlap the previous repeated
: element.
: no need to move.
:
: O(

avatar
P*f
11
这个结果是确定的么?是否要求子序列最长?
比如给定 1 1 1 2 2 3 3 5
生成1 2 1 2 1 3 5 3满足"sub sequence is ordered and no element repetition"
but the length of sub sequence is not maximium.
if this is acceptable, seems like we can apply swap based algorithm.

有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
唯一,有没有好的算法。只能使用O(1)的辅助空间。
O(n^2)的算法是很显然的。

【在 u*c 的大作中提到】
: 有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
: 要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
: 唯一,有没有好的算法。只能使用O(1)的辅助空间。
: O(n^2)的算法是很显然的。

avatar
a*e
12
An O(n log n) algorithm:
1. Let b = 1+ the max value (the last one in sequence);
2. Add b^i to the ith (zero based indexing) repeated element;
3. Sort the sequence as usual;
4. Recover the original sequence.

【在 u*c 的大作中提到】
: 有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
: 要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
: 唯一,有没有好的算法。只能使用O(1)的辅助空间。
: O(n^2)的算法是很显然的。

avatar
s*e
13
emmm, very nice

【在 a*******e 的大作中提到】
: An O(n log n) algorithm:
: 1. Let b = 1+ the max value (the last one in sequence);
: 2. Add b^i to the ith (zero based indexing) repeated element;
: 3. Sort the sequence as usual;
: 4. Recover the original sequence.

avatar
P*f
14
good, just a littile bit concern of overflow:)

An O(n log n) algorithm:
1. Let b = 1+ the max value (the last one in sequence);
2. Add b^i to the ith (zero based indexing) repeated element;
3. Sort the sequence as usual;
4. Recover the original sequence.

【在 a*******e 的大作中提到】
: An O(n log n) algorithm:
: 1. Let b = 1+ the max value (the last one in sequence);
: 2. Add b^i to the ith (zero based indexing) repeated element;
: 3. Sort the sequence as usual;
: 4. Recover the original sequence.

avatar
g*c
15
special case will overflow
here is mine idea
do runlength coding and special decoding to construct the required sequence.
coding O(n), decoding time complexity average/best caseO(n), I think 2*O(b)~=
O(1) space for runlength need if b is constant.
worst case is tricky, it looks like O(b*(n-b)), could achive O(n) in double for
loops.

【在 a*******e 的大作中提到】
: An O(n log n) algorithm:
: 1. Let b = 1+ the max value (the last one in sequence);
: 2. Add b^i to the ith (zero based indexing) repeated element;
: 3. Sort the sequence as usual;
: 4. Recover the original sequence.

avatar
u*c
16
每个序列都是剩下的元素中所能找到的最长的有序序列。

【在 P*****f 的大作中提到】
: 这个结果是确定的么?是否要求子序列最长?
: 比如给定 1 1 1 2 2 3 3 5
: 生成1 2 1 2 1 3 5 3满足"sub sequence is ordered and no element repetition"
: but the length of sub sequence is not maximium.
: if this is acceptable, seems like we can apply swap based algorithm.
:
: 有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
: 要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
: 唯一,有没有好的算法。只能使用O(1)的辅助空间。
: O(n^2)的算法是很显然的。

avatar
d*g
17
since only O(1) space is given, it is actually a hint: using swap
1. i = 1; (skip the first one, i == 0 )
*2. if a(i) <= a(i-1), find next one a(j) which is the first one that is
greater than a(i-1)
3. swap a(i) and a(j)
4. i ++, go to step 2 until i reaches the end of the array
*where in step 2, on the way to find the right a(j), if there is one element
a(m) which is equal to a(i-1) (thus greater than a(i)), put a(i) value to
index m, and use the value of a(m) to continue to find the right a(j)
avatar
t*t
18
你这个是O(n)吗?

element
then
to

【在 d***g 的大作中提到】
: since only O(1) space is given, it is actually a hint: using swap
: 1. i = 1; (skip the first one, i == 0 )
: *2. if a(i) <= a(i-1), find next one a(j) which is the first one that is
: greater than a(i-1)
: 3. swap a(i) and a(j)
: 4. i ++, go to step 2 until i reaches the end of the array
: *where in step 2, on the way to find the right a(j), if there is one element
: a(m) which is equal to a(i-1) (thus greater than a(i)), put a(i) value to
: index m, and use the value of a(m) to continue to find the right a(j)

avatar
c*d
19
that algorithm is O(n), but wont work. Since simply swap a[i] and a[j] will
mess up the order.

【在 t****t 的大作中提到】
: 你这个是O(n)吗?
:
: element
: then
: to

avatar
P*t
20
Cool! b * i 也可以吧!减少一点OVERFLOW的机会。

【在 a*******e 的大作中提到】
: An O(n log n) algorithm:
: 1. Let b = 1+ the max value (the last one in sequence);
: 2. Add b^i to the ith (zero based indexing) repeated element;
: 3. Sort the sequence as usual;
: 4. Recover the original sequence.

avatar
t*o
21
hmmm, 改得不错.

【在 P***t 的大作中提到】
: Cool! b * i 也可以吧!减少一点OVERFLOW的机会。
avatar
t*o
22
adumbrare 的code group是指数间距, 有OVERFLOW 的可能性。你的间距是线性的,
OVERFLOW的机会大大减小。我再改一下,间距为1,OVERFLOW的机会就更小些。
还是coding的思路,但不再用整数,而是用字符串:
1. add i_ prefix to the ith (zero based indexing) repeated element,
e.g., 1 1 2 3 3->0_1 1_1 0_2 0_3 1_3
2. sort the sequence in ascending order;
3. remove the prefix.

【在 P***t 的大作中提到】
: Cool! b * i 也可以吧!减少一点OVERFLOW的机会。
avatar
k*k
23
this is not O(1) extra space bah..

【在 t***o 的大作中提到】
: adumbrare 的code group是指数间距, 有OVERFLOW 的可能性。你的间距是线性的,
: OVERFLOW的机会大大减小。我再改一下,间距为1,OVERFLOW的机会就更小些。
: 还是coding的思路,但不再用整数,而是用字符串:
: 1. add i_ prefix to the ith (zero based indexing) repeated element,
: e.g., 1 1 2 3 3->0_1 1_1 0_2 0_3 1_3
: 2. sort the sequence in ascending order;
: 3. remove the prefix.

avatar
N*m
24
这个结果不唯一阿?怎么搞阿?

【在 u*c 的大作中提到】
: 有一个已经排好序的数组,其中有些重复的元素,比如{1,1,1,2,3,3,4,5,5}.现在
: 要把这个数组变成{1,2,3,4,5,1,3,5,1},也就是每个序列都是有序的且其中的元素
: 唯一,有没有好的算法。只能使用O(1)的辅助空间。
: O(n^2)的算法是很显然的。

avatar
o*p
25
不是说可以用线性O(1)的额外空间吗? 把数组元素挪到单(或者双)链表的额外空间上排
, 排好后挪回原来数组, 不就成了.... 这个应该是O(n)时间, O(1)的额外空间
不知道是不是理解漏了什么

【在 t****t 的大作中提到】
: 数组不好插入吧,如果是双链表就没问题.但是已经说了不许换空间了.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。