2010-05-13 4 views
0

나는 파이썬에서 알고리즘의 코드가 매우 짧다.하지만 자바로 변환해야한다. 나는 그 일을 할 수있는 프로그램을 찾지 못했기 때문에 그것을 번역하는 데 정말로 감사 할 것입니다.파이썬에서 자바로 번역

저는 알고리즘 작업이 어떻게되는지 아이디어를 알기 위해 파이썬을 조금 배웠습니다. 파이썬의 모든 객체이고 몇 가지 아주

sum(self.flow[(source, vertex)] for vertex, capacity in self.get_edges(source)) 

과 같은 confuzing 정말 만들어지기 때문에

가장 큰 문제는 "self.adj은"내가 어떻게 넣어하는 아무 생각이 여러 값을 갖는 해시 맵처럼 모두 함께. 자바 에서이 코드에 대한 더 나은 컬렉션인가요?

코드 :이 예의

class FlowNetwork(object): 
    def __init__(self): 
     self.adj, self.flow, = {},{} 

    def add_vertex(self, vertex): 
     self.adj[vertex] = [] 

    def get_edges(self, v): 
     return self.adj[v] 

    def add_edge(self, u,v,w=0): 
     self.adj[u].append((v,w)) 
     self.adj[v].append((u,0)) 
     self.flow[(u,v)] = self.flow[(v,u)] = 0 

    def find_path(self, source, sink, path): 
     if source == sink: 
      return path 
     for vertex, capacity in self.get_edges(source): 
      residual = capacity - self.flow[(source,vertex)] 
      edge = (source,vertex,residual) 
      if residual > 0 and not edge in path: 
       result = self.find_path(vertex, sink, path + [edge]) 
       if result != None: 
        return result 

    def max_flow(self, source, sink): 
     path = self.find_path(source, sink, []) 
     while path != None: 
      flow = min(r for u,v,r in path) 
      for u,v,_ in path: 
       self.flow[(u,v)] += flow 
       self.flow[(v,u)] -= flow 
       path = self.find_path(source, sink, []) 
     return sum(self.flow[(source, vertex)] for vertex, capacity in self.get_edges(source)) 
g = FlowNetwork() 
map(g.add_vertex, ['s','o','p','q','r','t']) 
g.add_edge('s','o',3) 
g.add_edge('s','p',3) 
g.add_edge('o','p',2) 
g.add_edge('o','q',3) 
g.add_edge('p','r',2) 
g.add_edge('r','t',3) 
g.add_edge('q','r',4) 
g.add_edge('q','t',2) 
print g.max_flow('s','t') 

결과는 "5"이다.

알고리즘 소스 버텍스 "s"에서 대상 "t"까지 그래프 (링크 된 목록 또는 기타)의 최대 흐름을 찾습니다.

많은 아이디어에 감사드립니다.

+2

이 숙제가 있습니까? –

+0

.class 파일을 생성하는 데 항상 jython (http://www.jython.org)이 있습니다. (실제로 .class 파일을 .java 파일로 디 컴파일하는 데 http://www.google.com/search?q=java+decompiler가 필요한 경우) – mawimawi

답변

2

자바에는 파이썬의 독해문 같은 것이 없습니다. 목록을 반복하는 코드로 대체해야하고 sum의 값을 집계해야합니다.

또한 self.flow은 쌍으로 색인화 된 사전 모양입니다. 이것을 맞추기위한 유일한 방법은 AFAIK, hashCodeequals을 구현하는 두 개의 필드가있는 클래스를 만들어 HashMap의 키로 사용하는 것입니다.

+0

[Michael Aaron Safyan] : 예 숙제이지만 파이썬 번역은 아닙니다. . 그것은 최대 흐름 문제에 관한 것이 었습니다. http://en.wikipedia.org/wiki/Maximum_flow_problem 이 알고리즘이 필요한 이유는 매우 짧기 때문입니다. 그러나 긴 밤 후에 나는 파이썬을 조금 배우고 그것을 손으로 번역한다. 그러나 그 후에는 오버 헤드가 많이 발생하므로 큰 그래프에는 유용하지 않습니다. 이제 더 나은 구현 방법을 찾고 있습니다. 따라서이 문제에 대해 더 잘 알고 있다면 추가 아이디어를 부탁드립니다. 감사합니다. – user340179