微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用密码记忆

如何解决用密码记忆

解决了 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 举报,一经查实,本站将立刻删除。