给定1000个数,如何把它均匀分成2个部分(一个大数部分,一个小数部分)

m
miked
楼主 (北美华人网)
任意给定1000个数,可重复。
请问如何分割成两个部分,让这两部分个数相同,其中一个部分是很大的数,另一个部分是很小的数。
d
dngdnhxqs
得了 看看别人怎么做吧
j
julie2020
我先来个暴力非最优 抛砖引玉 nlogn求中位数,然后n扫一遍就分出来了。 求中位数如果能做到n应该就是最优解了
m
mylittle9
medium of medium 找出中值,然后一遍快速排序。
不用排完,以中值为标准,比一遍分开两部分就可以了。

n
nj_guy
先把数放进一个binary tree(左小右大), 然后reroot,直到两边相等。reroot:假设左边少右边多,将现在的root放在左边subtree的最右端leaf的右侧,然后将右边subtree的最左端leaf放到root位置。
m
miked
先把数放进一个binary tree(左小右大), 然后reroot,直到两边相等。reroot:假设左边少右边多,将现在的root放在左边subtree的最右段leaf,然后将右边subtree的最左端leaf放到root位置。
nj_guy 发表于 2022-05-03 15:49

多谢。我最后决定采用你这个简单的方法。
m
miked
medium of medium 找出中值,然后一遍快速排序。
不用排完,以中值为标准,比一遍分开两部分就可以了。


mylittle9 发表于 2022-05-03 15:45

采用mean或者median 有时候,会发生一个集合很多数,一个集合很少的数。
比如:1, 100, 200,100,101,205
有一个集合只有1,这样一个元素。
n
nj_guy
多谢。我最后决定采用你这个简单的方法。
miked 发表于 2022-05-03 15:57

注意reroot的时候,我说的简单了,要稍微麻烦一点,自己小心看看。应该是把右边subtree最左端的leaf和下面的subtree移上来,把上面压下去。不过这都是标准程序,应该能找到package。
n
nickbear
medium of medium 找出中值,然后一遍快速排序。
不用排完,以中值为标准,比一遍分开两部分就可以了。


mylittle9 发表于 2022-05-03 15:45

这个应该是最优解,而且median of median结束时左右两边已经是in place的,不用run第二遍
h
hgs3579
if it is a problem for kids, then sufficient to use a priority queue with capacity set at 500: just dump the content of the queue at the end of the run and then we will have the answer.
otherwise, think about
self-balancing binary search tree // for interview like setting splay tree, or treaps // for work scenario
m
mylittle9
这个应该是最优解,而且median of median结束时左右两边已经是in place的,不用run第二遍
nickbear 发表于 2022-05-03 16:19

Yes, you are right. No need for the last run
n
nj_guy
medium of medium 找出中值,然后一遍快速排序。
不用排完,以中值为标准,比一遍分开两部分就可以了。


mylittle9 发表于 2022-05-03 15:45

找出中值这也叫答案?你还不如说找到中间,把两边一分就分开了。
f
facet
先把数放进一个binary tree(左小右大), 然后reroot,直到两边相等。reroot:假设左边少右边多,将现在的root放在左边subtree的最右端leaf的右侧,然后将右边subtree的最左端leaf放到root位置。
nj_guy 发表于 2022-05-03 15:49

Balanced tree
m
mylittle9
找出中值这也叫答案?你还不如说找到中间,把两边一分就分开了。
nj_guy 发表于 2022-05-03 17:18

冒昧的猜测一句,你不是学计算机课班出身的吧?
median of median是一个很经典算法,非常的基础。
复杂度O(n). Linear可解。




p
pinponlinzie
LZ没有说是机器分还是人来分啊。。。。
n
nj_guy
冒昧的猜测一句,你不是学计算机课班出身的吧?
median of median是一个很经典算法,非常的基础。
复杂度O(n). Linear可解。





mylittle9 发表于 2022-05-03 20:13

楼主的问题就是等价于如何实现找中值的问题,所以你的回答是没有任何意义的,至于现成算法当然可以用。
p
pinponlinzie
LZ也没有说要efficient的分啊。 大家会不会想太多啊
m
mylittle9
如果你要是学计算机的那也太弱智了。楼主的问题就是等价于如何实现找中值的问题,你第一次回答根本就没有感觉到问题的等价性,所以你的回答是没有任何意义的,然后你的辩解就是:有现成算法。好像谁不知道有现成算法似的。
nj_guy 发表于 2022-05-03 20:20

。。。
算了,不说啥了。





c
cfs
Find median, O(n). https://en.m.wikipedia.org/wiki/Quickselect
y
yjs_qz
先读入500个数排序,做为小数组,从第501个开始和小数组中最大的比, 大于的话新的数放入大数组, 小于的话把小数组中最大的放进大数组,新数进入小数组排序
t
tracylovebobo
让它们在Excel里面排好队