Redian新闻
>
问: android后台进程到底能不能杀干净?
avatar
问: android后台进程到底能不能杀干净?# PDA - 掌中宝
p*u
1
给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原
数组中该元素的个数。求原数组。原数组中元素是从1到n。
Example:
原数组 4,1, 3, 2
Count array 3, 0, 1, 0
求nlogn的算法。
avatar
C*e
2
工作幹的不開心。問問大牛們2009年3月的排期?
avatar
A*m
3
父母来探亲,想找个包括disney,universal studio,lv,and san diego sea world的华
人旅行团,有没有什么口碑好的旅行团推荐呢?谢谢!
还想问一下,我们准备5月下旬去,我怕7,8月份太热,这个时间如何呢?谢谢!
avatar
s*c
4
att版One X, ICS, 没有root
装了advanced task killer, 但是没用. 过两分钟各路神仙包括dropbox啊 facebook
啊 自己有turn on了
avatar
g*y
5
这个O(n)就够了:
public int[] recover(int[] a) {
int[] s = new int[a.length];
ArrayList list = new ArrayList();
for (int i=0; i
for (int i=0; is[i] = list.remove(a[i]);
}

return s;
}

【在 p*****u 的大作中提到】
: 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原
: 数组中该元素的个数。求原数组。原数组中元素是从1到n。
: Example:
: 原数组 4,1, 3, 2
: Count array 3, 0, 1, 0
: 求nlogn的算法。

avatar
y*0
6
您在等2个月就清楚了。
avatar
m*A
7
同问 以前自己去参加过LULUTRIP 超烂
avatar
D*A
8
传说android的app可以注册到某些系统事件上,比如改个日期什么的就可以启动app。
可以用autostarts取消这些注册。

facebook

【在 s******c 的大作中提到】
: att版One X, ICS, 没有root
: 装了advanced task killer, 但是没用. 过两分钟各路神仙包括dropbox啊 facebook
: 啊 自己有turn on了

avatar
s*n
9
list.remove的复杂度是多少?

【在 g**********y 的大作中提到】
: 这个O(n)就够了:
: public int[] recover(int[] a) {
: int[] s = new int[a.length];
: ArrayList list = new ArrayList();
: for (int i=0; i:
: for (int i=0; i: s[i] = list.remove(a[i]);
: }
:

avatar
C*e
10
兩個月再後退就慘了

您在等2个月就清楚了。

【在 y******0 的大作中提到】
: 您在等2个月就清楚了。
avatar
s*3
11
America Asia
C & J Sea Gull Hoilday
Bravo
avatar
z*g
12
搞不定,只能root, 然后在superuser权限下freeze这些app..
我用的rom toolbox pro,很不错。就是要6$.

facebook

【在 s******c 的大作中提到】
: att版One X, ICS, 没有root
: 装了advanced task killer, 但是没用. 过两分钟各路神仙包括dropbox啊 facebook
: 啊 自己有turn on了

avatar
a*m
13
从头往后扫描。每个数字是当前可用数字从小到大排序的序号。 查找数字的部分可以
把所有数字做成一个bst. 叶结点是实际数字,其他结点是从这里往下的数字数目。 这
样查找数字是lgn. 每次去掉一个数字的时候更新路上的结点值。
avatar
y*0
14
后退不后退由不得你。。。

【在 C******e 的大作中提到】
: 兩個月再後退就慘了
:
: 您在等2个月就清楚了。

avatar
j*n
15
年纪大的人还真不能随便去disney,universal studio玩。

【在 A****m 的大作中提到】
: 父母来探亲,想找个包括disney,universal studio,lv,and san diego sea world的华
: 人旅行团,有没有什么口碑好的旅行团推荐呢?谢谢!
: 还想问一下,我们准备5月下旬去,我怕7,8月份太热,这个时间如何呢?谢谢!

avatar
i*8
16
webos后台很干净
avatar
r*n
17
贴个c++的版本:
void restore(int cnt_arr[], int orig_arr[], size_t size)
{
vector svec;
for(size_t i=0; isvec.push_back(i+1);
for(size_t i=0; i{
vector::iterator iter=svec.begin()+cnt_arr[i];
orig_arr[i]=*iter;
svec.erase(iter);
}
}
不知道能不能写的更简洁点?

【在 g**********y 的大作中提到】
: 这个O(n)就够了:
: public int[] recover(int[] a) {
: int[] s = new int[a.length];
: ArrayList list = new ArrayList();
: for (int i=0; i:
: for (int i=0; i: s[i] = list.remove(a[i]);
: }
:

avatar
A*m
18
谢谢阿,ameica asia是不是那个据说比较贵的

【在 s******3 的大作中提到】
: America Asia
: C & J Sea Gull Hoilday
: Bravo

avatar
j*z
19
先把advanced task kill卸了再说。不知道你到底要省电到什么程度,开个dropbox,f
acebook,基本不会耗你电,你整天关来关去,它又自动重启,这才费电。
sync全开,轻度使用,HTC ONE X 三天没问题。后台乱跑的程序是指在后台运行占用
CPU资源,或者一直阻止手机sleep的程序,这些都是良民。

facebook

【在 s******c 的大作中提到】
: att版One X, ICS, 没有root
: 装了advanced task killer, 但是没用. 过两分钟各路神仙包括dropbox啊 facebook
: 啊 自己有turn on了

avatar
P*c
20
就跟前面指出的,这个不是O(nlogn)。vector里remove一个element的复杂度是O(n), 所以这个算法是O(n^2). 另外你这个有序数组里找第k大的数写复杂了,应该就像刚来Java那个,const time.
另外我觉得G家的题目不能用STL做。否则它肯定会问你STL是怎么实现的,这个更容易出错。

【在 r******n 的大作中提到】
: 贴个c++的版本:
: void restore(int cnt_arr[], int orig_arr[], size_t size)
: {
: vector svec;
: for(size_t i=0; i: svec.push_back(i+1);
: for(size_t i=0; i: {
: vector::iterator iter=svec.begin()+cnt_arr[i];
: orig_arr[i]=*iter;

avatar
m*A
21
请问哪个比较好啊?
贵点无所谓 主要是别这么赶。。。
avatar
A*D
22
advanced task kill对4.0没用
avatar
P*c
23
不明白,能否详细说说?

【在 a********m 的大作中提到】
: 从头往后扫描。每个数字是当前可用数字从小到大排序的序号。 查找数字的部分可以
: 把所有数字做成一个bst. 叶结点是实际数字,其他结点是从这里往下的数字数目。 这
: 样查找数字是lgn. 每次去掉一个数字的时候更新路上的结点值。

avatar
G*l
24
想听实话就是华人旅行社都是骗子,其实也不能怨旅行社,国内压价一个压过一个,这
边已经快没办法做了,美国亚洲,银河,也不是自己的,都是加盟店。也就是说你一年
交点钱自己有客源一样在他们名下干。
银河最牛,要是玩低价位,银河首当其冲,人家赔钱也做。
旅行社的给的酒店说三星,美国麻痹的五星都和国内四星没办法比了。所以三星还不如
国内“如家”了。
一楼说的disney,universal studio,lv,and san diego sea world都去的这种还真没有
。。。。除非一天包一个团。要吗就跟旅行社要vip自组团,让他们给报价。
实在找不到你再找我,我找人帮你做。。。。。
6楼的,没好的。除非像我说的自己租vip团。就好了。
avatar
f*s
25
定义一下轻度使用? gs2上班前拔掉 吃过晚饭就开始电量报警了 没装国产软件 该禁的
都禁了。 我觉得完全不开机都不一定能撑足72小时

,f

【在 j*****z 的大作中提到】
: 先把advanced task kill卸了再说。不知道你到底要省电到什么程度,开个dropbox,f
: acebook,基本不会耗你电,你整天关来关去,它又自动重启,这才费电。
: sync全开,轻度使用,HTC ONE X 三天没问题。后台乱跑的程序是指在后台运行占用
: CPU资源,或者一直阻止手机sleep的程序,这些都是良民。
:
: facebook

avatar
r*n
26
vector里面找数字那块是为了取对应的iterator,后面好用erase,不过也觉得不够简洁
漂亮,所以打算抛砖引玉。
假如这题是onsite用C/C++写的,我认为肯定是可以用stl的常见数据结构的,不然4,
50分钟怎么可能写个完整的结果出来?

所以这个算法是O(n^2). 另外你这个有序数组里找第k大的数写复杂了,应该就像刚
来Java那个,const time.
易出错。

【在 P**********c 的大作中提到】
: 就跟前面指出的,这个不是O(nlogn)。vector里remove一个element的复杂度是O(n), 所以这个算法是O(n^2). 另外你这个有序数组里找第k大的数写复杂了,应该就像刚来Java那个,const time.
: 另外我觉得G家的题目不能用STL做。否则它肯定会问你STL是怎么实现的,这个更容易出错。

avatar
x*i
27

就沒句好話。。。。。

【在 G******l 的大作中提到】
: 想听实话就是华人旅行社都是骗子,其实也不能怨旅行社,国内压价一个压过一个,这
: 边已经快没办法做了,美国亚洲,银河,也不是自己的,都是加盟店。也就是说你一年
: 交点钱自己有客源一样在他们名下干。
: 银河最牛,要是玩低价位,银河首当其冲,人家赔钱也做。
: 旅行社的给的酒店说三星,美国麻痹的五星都和国内四星没办法比了。所以三星还不如
: 国内“如家”了。
: 一楼说的disney,universal studio,lv,and san diego sea world都去的这种还真没有
: 。。。。除非一天包一个团。要吗就跟旅行社要vip自组团,让他们给报价。
: 实在找不到你再找我,我找人帮你做。。。。。
: 6楼的,没好的。除非像我说的自己租vip团。就好了。

avatar
A*D
28
换个新电池

【在 f*****s 的大作中提到】
: 定义一下轻度使用? gs2上班前拔掉 吃过晚饭就开始电量报警了 没装国产软件 该禁的
: 都禁了。 我觉得完全不开机都不一定能撑足72小时
:
: ,f

avatar
s*n
29
我总么觉得解 不唯一呢, 如果最后一个是最大的(n),其他的都是0,不管你怎么排序
avatar
m*w
30
看看后台有啥程序。另外电池多久了?

【在 f*****s 的大作中提到】
: 定义一下轻度使用? gs2上班前拔掉 吃过晚饭就开始电量报警了 没装国产软件 该禁的
: 都禁了。 我觉得完全不开机都不一定能撑足72小时
:
: ,f

avatar
P*c
31
你没理解对题意吧。
0000对应的解肯定是1234
如果是1324,那就是0100

排序

【在 s******n 的大作中提到】
: 我总么觉得解 不唯一呢, 如果最后一个是最大的(n),其他的都是0,不管你怎么排序
avatar
e*y
32
既然root了为何还要6刀来freeze?再在adb shell下将apk改名不就是freeze?

【在 z****g 的大作中提到】
: 搞不定,只能root, 然后在superuser权限下freeze这些app..
: 我用的rom toolbox pro,很不错。就是要6$.
:
: facebook

avatar
s*n
33
你说的对 我以为和直方图面积一样的那种,遇到大的就停了

【在 P**********c 的大作中提到】
: 你没理解对题意吧。
: 0000对应的解肯定是1234
: 如果是1324,那就是0100
:
: 排序

avatar
p*r
34

Something wrong with your GS2. My GS2 can last 3 days with original ROM. I
did root and remove ATT bloatware. I also turned off auto sync.

【在 f*****s 的大作中提到】
: 定义一下轻度使用? gs2上班前拔掉 吃过晚饭就开始电量报警了 没装国产软件 该禁的
: 都禁了。 我觉得完全不开机都不一定能撑足72小时
:
: ,f

avatar
d*r
35
再循环里面erase,不小心很容易出bug
你这个循环里erase后,vector后面的数会补上来,应该加一个i--否者就跳过了一个数。

【在 r******n 的大作中提到】
: 贴个c++的版本:
: void restore(int cnt_arr[], int orig_arr[], size_t size)
: {
: vector svec;
: for(size_t i=0; i: svec.push_back(i+1);
: for(size_t i=0; i: {
: vector::iterator iter=svec.begin()+cnt_arr[i];
: orig_arr[i]=*iter;

avatar
d*b
36
似乎unlock的都没有这些?我买来后把facebook关掉后就再也没出现过facebook,而且
facebook的应用是可以remove的。

facebook

【在 s******c 的大作中提到】
: att版One X, ICS, 没有root
: 装了advanced task killer, 但是没用. 过两分钟各路神仙包括dropbox啊 facebook
: 啊 自己有turn on了

avatar
d*r
37
size 也会变化,要每次call

数。

【在 d*******r 的大作中提到】
: 再循环里面erase,不小心很容易出bug
: 你这个循环里erase后,vector后面的数会补上来,应该加一个i--否者就跳过了一个数。

avatar
j*z
38
轻度使用就是屏幕on时间总共<1.5小时。建议你去factory reset一下,然后只装必要的
app,过一个晚上看看还剩多少电。如果还不行可能就是你电池或者手机的问题了。

【在 f*****s 的大作中提到】
: 定义一下轻度使用? gs2上班前拔掉 吃过晚饭就开始电量报警了 没装国产软件 该禁的
: 都禁了。 我觉得完全不开机都不一定能撑足72小时
:
: ,f

avatar
d*d
39
这一段:
size_t j=0;
while(j{
++j;
++iter;
}
直接写:
iter = iter + cnt_arr[i]
不就得了.vector的iterator是random access型的

【在 r******n 的大作中提到】
: 贴个c++的版本:
: void restore(int cnt_arr[], int orig_arr[], size_t size)
: {
: vector svec;
: for(size_t i=0; i: svec.push_back(i+1);
: for(size_t i=0; i: {
: vector::iterator iter=svec.begin()+cnt_arr[i];
: orig_arr[i]=*iter;

avatar
s*n
40
facebook这个烂公司,早期版本居然有wakelock leak导致机器不能sleep.尼玛,就是把
android 放一天也能发现这个bug啊。可见fb的测试差到什么地步。

,f

【在 j*****z 的大作中提到】
: 先把advanced task kill卸了再说。不知道你到底要省电到什么程度,开个dropbox,f
: acebook,基本不会耗你电,你整天关来关去,它又自动重启,这才费电。
: sync全开,轻度使用,HTC ONE X 三天没问题。后台乱跑的程序是指在后台运行占用
: CPU资源,或者一直阻止手机sleep的程序,这些都是良民。
:
: facebook

avatar
t*r
41
OlogN
有点难度啊。
想半天还是不对,MARK一下
avatar
c*7
42
俺的手机,sync全开, google latitude, QQ, sipdroid, facebook,twitter,
dropbox, evernote, sms backup+,hotmail,yahoo mail,textme 等等,一晚上十个
小时掉电7%. 从来没用过task killer。
用电最多的是屏幕,电话耗电很少,如果不开屏幕,用两天没问题。
但是看书、上网的话,6个小时就完蛋了。
avatar
h*g
43
题啥意思? 能不能具体点?

【在 p*****u 的大作中提到】
: 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原
: 数组中该元素的个数。求原数组。原数组中元素是从1到n。
: Example:
: 原数组 4,1, 3, 2
: Count array 3, 0, 1, 0
: 求nlogn的算法。

avatar
k*g
44
我手机有很多那种carrier- or manufacturer-installed applications,没用又kill
不掉,占巨多内存,是不是只有root才能清掉了?
avatar
g*s
45
//nlgn
public class BTree {
Node root;
public BTree(int n) {
root = makeTree(n, 0);
}
private Node makeTree(int number, int base) {
if (number == 0) return null;
Node node = new Node((number + 1) / 2 + base);
node.numOfLeftChildren = (number - 1) / 2;
node.left = makeTree(node.numOfLeftChildren, base);
node.right = makeTree(number / 2, node.value);
return node;
}
public Node remove(int index) {
return remove(root, index);
}
private Node remove(Node node, int index) {
if (node.numOfLeftChildren > index) {
//left
node.numOfLeftChildren--;
return remove(node.left, index);
}
if (node.numOfLeftChildren == index && !node.removed) {
//current
node.removed = true;
return node;
}
//right
return remove(node.right, index - node.numOfLeftChildren - (node.
removed ? 0 : 1));
}
public static int[] recover(int[] a) {
BTree list = new BTree(a.length);
int[] s = new int[a.length];
for (int i = 0; i < a.length; i++) {
s[i] = list.remove(a[i]).value;
}
return s;
}
static class Node {
int numOfLeftChildren;
int value;
Node left;
Node right;
boolean removed = false;
Node(int value) {
this.value = value;
}
}

public static void main(String[] args) {
List x = new ArrayList();
int NUM = 100;
for (int i = 0; i < NUM; i++) x.add(i + 1);
Collections.shuffle(x);
int[] a = makeSample(x.toArray());//new int[]{2,0,1,0};
System.out.println(Arrays.toString(x.toArray()));
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(recover(a)));
}
private static int[] makeSample(Object[] x) {
int[] a = new int[x.length];
for (int i = 0; i < a.length; i++)
for (int j = i + 1; j < a.length; j++) {
if (((Integer) x[j]) < ((Integer) x[i])) a[i]++;
}
return a;
}
}
avatar
g*s
46
it is still O(n*n)
avatar
s*y
47
大牛,说一下你得code思路阿,看得不是很懂。

【在 g***s 的大作中提到】
: //nlgn
: public class BTree {
: Node root;
: public BTree(int n) {
: root = makeTree(n, 0);
: }
: private Node makeTree(int number, int base) {
: if (number == 0) return null;
: Node node = new Node((number + 1) / 2 + base);
: node.numOfLeftChildren = (number - 1) / 2;

avatar
s*y
48
要是这个single link list改成hash_map+double linklist是不是就可以?

【在 s*****n 的大作中提到】
: list.remove的复杂度是多少?
avatar
a*m
49
前面那个树开始是这样的,前面两行是计数,最后一行叶子是实际数字:
。。。。4
。。。2。。2
。。1。2。3。4
取走第一个4以后是
。。。。3
。。。2。。1
。。1。2。3
再取走1是
。。。。2
。。。1。。。1
。。。。2。3
关键是查现在的第几个数字需要lgn复杂度。所以很自然用树表示。
avatar
a*m
50
hash没有排序功能。linklist都是n,不管single,double.

【在 s*****y 的大作中提到】
: 要是这个single link list改成hash_map+double linklist是不是就可以?
avatar
s*x
51
这个怎么样?
也用 BST, every node has extra info to remember how many nodes on its left
subtree, and original index in the array. then scan the array from right to
left, so we can easily build a whole BST as the array tells us how many
nodes are less than a node.
at the end scan the BST by in-order and fill the numbers from 1 to n.
avatar
a*m
52
original index不用,用了反而不能lgn了,因为你需要更新it. 只用左子树叶子数目应
该可以。
avatar
s*y
53
hash_map
double_linklist
delete value的时候,从hahs_map里面拿到要删除的node指针,然后从double_
linklist里面delete那个node,这不是o(1)?

【在 a********m 的大作中提到】
: hash没有排序功能。linklist都是n,不管single,double.
avatar
m*t
54
实际上,因为本题vector里的数据是序的,所以remove操作可以用binary search。
这样一来复杂度就是nlogn。
只不过这样一来我们不能使用标准的vector,需要自己 写code实现。

所以这个算法是O(n^2). 另外你这个有序数组里找第k大的数写复杂了,应该就像刚
来Java那个,const time.
易出错。

【在 P**********c 的大作中提到】
: 就跟前面指出的,这个不是O(nlogn)。vector里remove一个element的复杂度是O(n), 所以这个算法是O(n^2). 另外你这个有序数组里找第k大的数写复杂了,应该就像刚来Java那个,const time.
: 另外我觉得G家的题目不能用STL做。否则它肯定会问你STL是怎么实现的,这个更容易出错。

avatar
a*m
55
这个linklist干啥用? 比如现在hash里面有 3,4,5,7,9。我要第三大元素,怎么
拿到?

【在 s*****y 的大作中提到】
: hash_map
: double_linklist
: delete value的时候,从hahs_map里面拿到要删除的node指针,然后从double_
: linklist里面delete那个node,这不是o(1)?

avatar
g*s
56
this BTree is a binary search tree, stored values from 1..n
Node
numOfLeftChildren is used to store the total number of nodes in the left(
all number are less than current value)
removed is used to mark it is removed
remove(index) : remove the index-th from the btree(just like list.remove(
index)). we use recursive method remove(Node node, int index) to do it.
check left/current/right.

【在 s*****y 的大作中提到】
: 大牛,说一下你得code思路阿,看得不是很懂。
avatar
m*t
57
总结一下,用一个vector存放1...n。
从头到尾扫描给定的数组,每得到一个值,从vector里删掉。因为vector里数据是有序
的,因此remove操作可以使用二分法,复杂度为O(logn).
这样本算法复杂度为O(nlogn).
avatar
g*s
58
check my codes. i did with a similar idea. but no original index needed.

to

【在 s**x 的大作中提到】
: 这个怎么样?
: 也用 BST, every node has extra info to remember how many nodes on its left
: subtree, and original index in the array. then scan the array from right to
: left, so we can easily build a whole BST as the array tells us how many
: nodes are less than a node.
: at the end scan the BST by in-order and fill the numbers from 1 to n.

avatar
g*s
59
"因此remove操作可以使用二分法" how?

【在 m****t 的大作中提到】
: 总结一下,用一个vector存放1...n。
: 从头到尾扫描给定的数组,每得到一个值,从vector里删掉。因为vector里数据是有序
: 的,因此remove操作可以使用二分法,复杂度为O(logn).
: 这样本算法复杂度为O(nlogn).

avatar
s*x
60
i c, but removing has overhead too.

【在 g***s 的大作中提到】
: check my codes. i did with a similar idea. but no original index needed.
:
: to

avatar
a*m
61
vec的删除操作复杂度n

【在 m****t 的大作中提到】
: 实际上,因为本题vector里的数据是序的,所以remove操作可以用binary search。
: 这样一来复杂度就是nlogn。
: 只不过这样一来我们不能使用标准的vector,需要自己 写code实现。
:
: 所以这个算法是O(n^2). 另外你这个有序数组里找第k大的数写复杂了,应该就像刚
: 来Java那个,const time.
: 易出错。

avatar
a*m
62
那个overhead是lgn.符合要求。

【在 s**x 的大作中提到】
: i c, but removing has overhead too.
avatar
g*s
63
Did you check my codes? remove is log N

【在 s**x 的大作中提到】
: i c, but removing has overhead too.
avatar
d*r
64
orig: 4, 1, 3, 2
count: 3, 0, 1, 0
use a priority queue, pq, element comparison based on count array value
first,
count array index second
1. insert all count array elements into pq
2. extract min from pq until empty, fill the corresponding position of orig
array with increasing values
ex.
3 0 1 0
0 1 2 3
pq order would be. 1 3 2 0
then orig[1] = 1, orig[3] = 2, orig[2] = 3, orig[0] = 4

【在 p*****u 的大作中提到】
: 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原
: 数组中该元素的个数。求原数组。原数组中元素是从1到n。
: Example:
: 原数组 4,1, 3, 2
: Count array 3, 0, 1, 0
: 求nlogn的算法。

avatar
s*y
65
我想错了,thanks。

【在 a********m 的大作中提到】
: 这个linklist干啥用? 比如现在hash里面有 3,4,5,7,9。我要第三大元素,怎么
: 拿到?

avatar
d*r
66
c++ code:
typedef struct E {
int i;
int v;
E(int i_, int v_) : i(i_), v(v_) {}
} E;
struct Comp {
bool operator()(const E& a, const E& b) {
if (a.v > b.v) { return true; }
else if (a.v < b.v) { return false; }
else { return a.i > b.i; }
}
};
void recover(int count[], int orig[], int n) {
std::priority_queue, Comp> pq;
for (int i=0;iE e(i, count[i]);
pq.push(e);
}
int k=1;
while(!pq.empty()) {
E e = pq.top();
orig[e.i] = k++;
pq.pop();
}
}

orig

【在 d*******r 的大作中提到】
: orig: 4, 1, 3, 2
: count: 3, 0, 1, 0
: use a priority queue, pq, element comparison based on count array value
: first,
: count array index second
: 1. insert all count array elements into pq
: 2. extract min from pq until empty, fill the corresponding position of orig
: array with increasing values
: ex.
: 3 0 1 0

avatar
g*s
67
It is incorrect. e.g.
[1, 0, 0]

【在 d*******r 的大作中提到】
: c++ code:
: typedef struct E {
: int i;
: int v;
: E(int i_, int v_) : i(i_), v(v_) {}
: } E;
: struct Comp {
: bool operator()(const E& a, const E& b) {
: if (a.v > b.v) { return true; }
: else if (a.v < b.v) { return false; }

avatar
j*l
68
可以化归为这样一道题:
设计一个有序的数据结构,最初里头有自然数1到n这n个元素,
随后这些元素可以被删除,但剩下元素仍然保持有序。
要求实现方法GetKthElement(int k)和RemoveKthElemenet(int k),使得它们在任意时
刻都不超过O(lgN), N为当前的元素个数, 1 <= k <= N
感觉要结合BST之类
avatar
j*l
69
以前有道题是, 如何在log(N)时间找到BST的第i个元素。方法就是每个节点附加左子树
的元素个数和右子树的元素个数。
avatar
d*r
70
you are right.
再想想

【在 g***s 的大作中提到】
: It is incorrect. e.g.
: [1, 0, 0]

avatar
l*i
71
you can also use fenwick tree, which is simple to implement.
avatar
j*l
72
Should be:
Node remove(Node node, int index)
{
if (node.numOfLeftChildren >= index)
{
// left
node.numOfLeftChildren--;
return remove(node.left, index);
}
else if (node.numOfLeftChildren + 1 == index && !node.removed)
{
// current
node.removed = true;
return node;
}
else
{
// right
return remove(node.right, index - node.numOfLeftChildren - (node.
removed ? 0 : 1));
}
}

【在 g***s 的大作中提到】
: //nlgn
: public class BTree {
: Node root;
: public BTree(int n) {
: root = makeTree(n, 0);
: }
: private Node makeTree(int number, int base) {
: if (number == 0) return null;
: Node node = new Node((number + 1) / 2 + base);
: node.numOfLeftChildren = (number - 1) / 2;

avatar
g*s
73
为什么改? 不觉得原来有问题。改了反而错了。例如index=0

Should be:Node remove(Node node, int index){
★ Sent from iPhone App: iReader Mitbbs Lite 7.20

【在 j**l 的大作中提到】
: Should be:
: Node remove(Node node, int index)
: {
: if (node.numOfLeftChildren >= index)
: {
: // left
: node.numOfLeftChildren--;
: return remove(node.left, index);
: }
: else if (node.numOfLeftChildren + 1 == index && !node.removed)

avatar
j*l
74
I see, I assume index start from 1, while you assume index start from 0
My case should use:
s[i] = list.remove(a[i] + 1).value, since a[i] start from 0

【在 g***s 的大作中提到】
: 为什么改? 不觉得原来有问题。改了反而错了。例如index=0
:
: Should be:Node remove(Node node, int index){
: ★ Sent from iPhone App: iReader Mitbbs Lite 7.20

avatar
l*e
75
其实就是Dynamic order statistics
大家可以参考算法导论14.1内容:
需要在O(lgn)时间内取得第i大元素,同时调整树的时间也应该在O(lgn)
avatar
n*y
76
Idea
3 0 1 0
Step 1: use any nlgn Alg to sort and memorize old position
3 1 0 0
Step 2: count same from left to right O(n)
1 1 2
Step 3: place # (in this order: 2 1 1) O(n)
index: 0 1 2 3
1
1 2
3 1 2
4 3 1 2
Step 4: access using old position
avatar
k*n
77
There is a straightforward solution:
Suppose we have a set of 1 to n, then from the 1st element of the count-
array c[], a[i] is the c[i]'th element left in the set, when we move forward
, we also need to delete a[i] from the set.
So the problem is, how to find and delete k'th element in lgn time.
This is traditional. A BST with subtree size should be enough.

【在 p*****u 的大作中提到】
: 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原
: 数组中该元素的个数。求原数组。原数组中元素是从1到n。
: Example:
: 原数组 4,1, 3, 2
: Count array 3, 0, 1, 0
: 求nlogn的算法。

avatar
k*n
78
wrong, in a sorted vector, it is true that find k can be achieved in O(lgn),
but remove it need O(n).

【在 m****t 的大作中提到】
: 总结一下,用一个vector存放1...n。
: 从头到尾扫描给定的数组,每得到一个值,从vector里删掉。因为vector里数据是有序
: 的,因此remove操作可以使用二分法,复杂度为O(logn).
: 这样本算法复杂度为O(nlogn).

avatar
a*2
79
可以用merge sort(desc)吧
思路更简单:
merge 的时候对于前半部分的元素i和后半部分的元素j
如果input[i] >= input[j] 那么i对应的元素的count就应该增加 high-j+1
这样每次merge的时候都保证后半部分比他小的元素被加进来了
worst case也是O(nlogn)
avatar
q*x
80
你说的是逆问题吧。

【在 a**********2 的大作中提到】
: 可以用merge sort(desc)吧
: 思路更简单:
: merge 的时候对于前半部分的元素i和后半部分的元素j
: 如果input[i] >= input[j] 那么i对应的元素的count就应该增加 high-j+1
: 这样每次merge的时候都保证后半部分比他小的元素被加进来了
: worst case也是O(nlogn)

avatar
q*x
81
我觉得这个是正解。

【在 l*****e 的大作中提到】
: 其实就是Dynamic order statistics
: 大家可以参考算法导论14.1内容:
: 需要在O(lgn)时间内取得第i大元素,同时调整树的时间也应该在O(lgn)

avatar
g*s
82
要编一个Dynamic order statistics的删除算法,那可远远超过了一般面试难度啊。即
使是acm/icpc,或者IIO都会尽量避免去做这个麻烦的算法。

【在 q****x 的大作中提到】
: 我觉得这个是正解。
avatar
q*x
83
其实思路上比较容易,因为都是现成的。
你老的解法是定制简化版,更牛。
另外我想不用删除吧。插入也行。

【在 g***s 的大作中提到】
: 要编一个Dynamic order statistics的删除算法,那可远远超过了一般面试难度啊。即
: 使是acm/icpc,或者IIO都会尽量避免去做这个麻烦的算法。

avatar
a*2
84
这样做应该没错吧?

【在 q****x 的大作中提到】
: 你说的是逆问题吧。
avatar
a*2
85
没有仔细验证
typedef pair PAIR;
void getCountArray(vector input)
{
int len = input.size();
vector count(len, 0);
vector input1;
int i;
for( i = 0; i < len; i++)
input1.push_back(PAIR(input[i],i));
vector tmp( len, PAIR(0,0));
MergeSort(input1, 0, len-1, tmp, count);
for( i = 0; i < len; i++)
cout << count[i] ;
cout << endl;
}
void Merge(vector& input, int low, int mid, int high,vector&
tmp
, vector& count)
{
int i = low;
int j = mid;
int k = low;
while( i < mid && j <= high)
{
if(input[i].first >= input[j].first)
{
count[input[i].second] += high-j+1;
tmp[k++] = input[i++];

}
else
{
tmp[k++] = input[j++];

}
}
while( i < mid)
tmp[k++] = input[i++];
while( j <= high)
tmp[k++] = input[j++];
for( i = low; i <= high; i++)
{
input[i] = tmp[i];
}
}
void MergeSort(vector& input, int low, int high,vector& tmp,
vector& count)
{
if( low >= high) return;
int mid = low + (high-low)/2;
MergeSort(input, low, mid, tmp, count);
MergeSort(input, mid+1, high,tmp, count);
Merge(input, low, mid+1, high, tmp, count);
}
avatar
e*r
86
看IT面经:
http://haiwaibbs.com/forum.php?mod=forumdisplay&fid=47

【在 p*****u 的大作中提到】
: 给定一个数字数组 (Let's call it count-array) ,其中每个元素是从末端数小于原
: 数组中该元素的个数。求原数组。原数组中元素是从1到n。
: Example:
: 原数组 4,1, 3, 2
: Count array 3, 0, 1, 0
: 求nlogn的算法。

avatar
d*l
87
我记得POJ上有一道一模一样的题,是典型的线段树/树状数组的题,线段树可以做到
nlogn,树状数组nlog^2n。我应该A掉了,方法就是用线段树维护一个区间内还剩下的
点的个数。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。