问题描述
我解决了 Leetcode 中名为“Loud and Rich”的 problem。这样做之后,我开始考虑如何在 Cypher 中解决这个问题,现在我没有解决方案。 这是问题的定义:
在一组 N 人(标记为 0、1、2、...、N-1)中,每个人的钱数不同,安静程度也不同。
为方便起见,我们将标签为 x 的人称为“人 x”。
如果人x肯定有更多,我们会说richer[i] = [x,y] 钱比人y。请注意,更丰富的可能只是有效的一个子集 观察。
另外,如果人 x 的安静度为 q,我们会说 quiet[x] = q。
现在,返回一个答案,其中 answer[x] = y 如果 y 是最不安静的人 (即,quiet[y] 值最小的人 y),其中 钱肯定等于或多于人x的人。
我在 java 中的解决方案使用 DFS 和 memoization 在安静数组中找到最小值。
public DFS(final Map<Integer,List<Integer>> graph,final int[] quiet) {
this.graph = graph;
this.quiet = quiet;
}
public int dfs(int i){
if (memoization.containsKey(i))
return memoization.get(i);
if (!graph.containsKey(i) || graph.get(i).size() == 0)
return i;
int result = graph.get(i).stream()
.map(this::dfs)
.reduce(i,(num1,num2 )-> quiet[num1] < quiet[num2] ? num1 : num2);
memoization.put(i,result);
return result;
}
在 Neo4j 中我创建了节点和关系:
create
(n0:RichPerson {num:0,quiet:3}),(n1:RichPerson {num:1,quiet:2}),(n2:RichPerson {num:2,quiet:5}),(n3:RichPerson {num:3,quiet:4}),(n4:RichPerson {num:4,quiet:6}),(n5:RichPerson {num:5,quiet:1}),(n6:RichPerson {num:6,quiet:7}),(n7:RichPerson {num:7,quiet:0}),(n0) -[:Richer]-> (n1),(n1) -[:Richer]-> (n2),(n1) -[:Richer]-> (n3),(n7) -[:Richer]-> (n3),(n3) -[:Richer]-> (n4),(n3) -[:Richer]-> (n5),(n3) -[:Richer]-> (n6)
return n0,n1,n2,n3,n4,n5,n6,n7;
我想到的唯一解决方案如下:
MATCH path=( (n1:RichPerson) -[:Richer*0..]-> (n2) )
WITH
n1,reduce(
min_quiet=n1.quiet,n IN nodes(path) |
CASE
WHEN n.quite < min_quiet THEN n.quite
ELSE min_quiet
END
) AS min_quiet
RETURN distinct n1,min_quiet
order by n1.num
当然,在大数据上是很慢的,因为这里没有memoization。是否可以加快查询速度?还是我需要写一个用户定义的函数来解决 Neo4j 中的数据问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)