Redian新闻
>
Re: 有人和西人动过手吗? (转载)
avatar
Re: 有人和西人动过手吗? (转载)# Joke - 肚皮舞运动
f*w
1
Maximum sum contiguous subsequence的变种
用O(nlogn)的方法来check一个实数序列里是否存在和为0的连续子序列
开始想着用divide and conquer,但是没想明白怎么combine左半部分和右半部分
avatar
p*g
2
【 以下文字转载自 WaterWorld 讨论区 】
发信人: juanxi (胡安 . 克塞), 信区: WaterWorld
标 题: Re: 有人和西人动过手吗?
发信站: BBS 未名空间站 (Tue Jun 19 19:05:32 2012, 美东)
疯狂英语的李阳
avatar
l*e
3
s[i]=\sigma a[i] 对s排序 找相邻gap最小的

【在 f*******w 的大作中提到】
: Maximum sum contiguous subsequence的变种
: 用O(nlogn)的方法来check一个实数序列里是否存在和为0的连续子序列
: 开始想着用divide and conquer,但是没想明白怎么combine左半部分和右半部分

avatar
r*d
4
哈哈。

【在 p*********g 的大作中提到】
: 【 以下文字转载自 WaterWorld 讨论区 】
: 发信人: juanxi (胡安 . 克塞), 信区: WaterWorld
: 标 题: Re: 有人和西人动过手吗?
: 发信站: BBS 未名空间站 (Tue Jun 19 19:05:32 2012, 美东)
: 疯狂英语的李阳

avatar
f*w
5

所以意思是如果存在和为0的子序列,对s排序之后一定有相等的2个元素吗?
好像是对的,谢谢!

【在 l***e 的大作中提到】
: s[i]=\sigma a[i] 对s排序 找相邻gap最小的
avatar
w*r
6
1. sorting A in ascending order
2. find the closest two points where A[i] < 0 < A[j]
3. initialize: left_p = i; right_p = j
4. if sum[left_p -> right_p] > 0; left_p--
else if (sum[left_p -> right_p] < 0); right_p++

【在 f*******w 的大作中提到】
: Maximum sum contiguous subsequence的变种
: 用O(nlogn)的方法来check一个实数序列里是否存在和为0的连续子序列
: 开始想着用divide and conquer,但是没想明白怎么combine左半部分和右半部分

avatar
f*w
7

我开始也是这么想的
可是不对啊,这样找到的是和为0的子序列
但是不能保证是连续子序列

【在 w*********r 的大作中提到】
: 1. sorting A in ascending order
: 2. find the closest two points where A[i] < 0 < A[j]
: 3. initialize: left_p = i; right_p = j
: 4. if sum[left_p -> right_p] > 0; left_p--
: else if (sum[left_p -> right_p] < 0); right_p++

avatar
y*w
8
why ? sum[left_p -> right_p] is 连续的呀?

【在 f*******w 的大作中提到】
:
: 我开始也是这么想的
: 可是不对啊,这样找到的是和为0的子序列
: 但是不能保证是连续子序列

avatar
f*w
9

因为你是排过序之后的连续
排序之前的不是被打乱了

【在 y*w 的大作中提到】
: why ? sum[left_p -> right_p] is 连续的呀?
avatar
g*u
10
how about this?
(1) define
b[i]=sum_{a[i]} {i=0,1,...,n-1}
(2) sort b[i]
(3) find the index j, k, such that
b[j]+b[k]=0, then we know in original array sum[ a[min{i,j}],..., a[
min{i,j}] ] =0
avatar
i*7
11
通过A[i]序列得到sum[i]序列。
然后进行排序,排序的过程里要记录下它原先的index。
有相等的sum值就可以返回true了。
当然,也有O(n)的解法。
Double sum = 0;
HashSet hs = new HashSet
for(int i = 0; i < a.length; i++){
sum += a[i];
if(hs.contains(sum))
return true;
hs.add(sum);
}
return false;
avatar
g*e
12
This HashSet thing does not work. Avoid!

【在 i*********7 的大作中提到】
: 通过A[i]序列得到sum[i]序列。
: 然后进行排序,排序的过程里要记录下它原先的index。
: 有相等的sum值就可以返回true了。
: 当然,也有O(n)的解法。
: Double sum = 0;
: HashSet hs = new HashSet
: for(int i = 0; i < a.length; i++){
: sum += a[i];
: if(hs.contains(sum))
: return true;

avatar
i*7
13
在Java里,HashSet是可以有的。
只是在C++里,hash_set是没有的。
要换成unordered_set

【在 g**e 的大作中提到】
: This HashSet thing does not work. Avoid!
avatar
i*7
14
public static boolean testDoubleHS(Double a[]){
Double sum = 0.0;
HashSet hs = new HashSet();
hs.add(sum);
for(int i = 0; i < a.length; i++){
sum += a[i];
if(hs.contains(sum))
return true;
hs.add(sum);
}
return false;
}
这个是我刚才在eclipse里面测试过了。应该是可以的。
avatar
g*e
15
换台机器换个系统换个JVM就不一定可以了。关键问题在那个加法
[0.1, 0.2, -0.2] 当你加到第三个数的时候,很可能结果是0.10000000001,这时候
contains返回false

【在 i*********7 的大作中提到】
: public static boolean testDoubleHS(Double a[]){
: Double sum = 0.0;
: HashSet hs = new HashSet();
: hs.add(sum);
: for(int i = 0; i < a.length; i++){
: sum += a[i];
: if(hs.contains(sum))
: return true;
: hs.add(sum);
: }

avatar
i*7
16
我明白你的意思。
双精度数的处理多少会有小数点后几位的偏差。
所以我自己才测试了一下。感觉数目比较小的时候适用。比较大的情况下我也不好说。
这本身就是C++和Java对浮点数的处理导致的。算法本身是没错的。
我也就提供一下思路。因为毕竟就算法本身而言,这个是time on, space on
而对sum排序后再比较的算法,是time onlogn, space on的。要稍微好一些。

【在 g**e 的大作中提到】
: 换台机器换个系统换个JVM就不一定可以了。关键问题在那个加法
: [0.1, 0.2, -0.2] 当你加到第三个数的时候,很可能结果是0.10000000001,这时候
: contains返回false

avatar
t*a
17
谢谢提示。据此写clojure code如下,调试成功
(use 'incanter.core)
(defn subseqzero? [a]
(let [ac (cumulative-sum (cons 0 a))
acf (frequencies ac)]
(some #(> % 1) (vals acf))))
(def a [1 -3 4 1 -2 9])
(subseqzero? a) ; true
(def a [1 -3 4 3 -2 9])
(subseqzero? a) ; nil

【在 i*********7 的大作中提到】
: 通过A[i]序列得到sum[i]序列。
: 然后进行排序,排序的过程里要记录下它原先的index。
: 有相等的sum值就可以返回true了。
: 当然,也有O(n)的解法。
: Double sum = 0;
: HashSet hs = new HashSet
: for(int i = 0; i < a.length; i++){
: sum += a[i];
: if(hs.contains(sum))
: return true;

avatar
i*7
18
我擦。。你的什么代码。。完全看不懂。。
好吧。。clojure是啥。。。

【在 t****a 的大作中提到】
: 谢谢提示。据此写clojure code如下,调试成功
: (use 'incanter.core)
: (defn subseqzero? [a]
: (let [ac (cumulative-sum (cons 0 a))
: acf (frequencies ac)]
: (some #(> % 1) (vals acf))))
: (def a [1 -3 4 1 -2 9])
: (subseqzero? a) ; true
: (def a [1 -3 4 3 -2 9])
: (subseqzero? a) ; nil

avatar
t*e
19
请问sum[i]序列是什么?

【在 i*********7 的大作中提到】
: 通过A[i]序列得到sum[i]序列。
: 然后进行排序,排序的过程里要记录下它原先的index。
: 有相等的sum值就可以返回true了。
: 当然,也有O(n)的解法。
: Double sum = 0;
: HashSet hs = new HashSet
: for(int i = 0; i < a.length; i++){
: sum += a[i];
: if(hs.contains(sum))
: return true;

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。