2017-05-21 4 views
-2
#ifndef ACTOR_H 
#define ACTOR_H 

#include<vector> 
#include<iostream> 
#include<queue> 
#include<string> 

struct Link; 
/* (Vertex) Object Class to represent actors */ 
class ActorNode { 
    private: 
     /*Member Variables*/ 
     std::string name; 
     std::vector<Link*> links; 

    public: 
     /*Constructor*/ 
     ActorNode() : name("") {} 

     /*Getters and Setters*/ 
     std::string getName(); 
     void setName(std::string actor); 

     std::vector<Link*> getLinks(); 

     /*Member Functions*/ 
     //void addLink(); 
}; 
struct Link { 

    /*Member Variables*/ 
    ActorNode* cs1; 
    ActorNode* cs2; 
    std::string movieTitle; 
    int year; 
    int weight; 

    /*Constructor*/ 
    Link() : cs1(0), cs2(0), movieTitle(""), year(1), weight(1) {} 

}; 
#endif 

저녁 모두. 그래서 저는 두 배우가 함께 행동 한 영화의 연결된 액터의 그래프에서 두 배우 (가중치와 비가 중도) 사이의 최단 경로를 풀기위한 그래프 구현 작업을하고 있습니다. 최단 경로 문제를 풀기위한 것입니다. Dijkstra의 알고리즘을 사용합니다.그래프를 작성하기에 충분한 정보를 저장하는 중

내 구현은 액터의 이름 인 문자열과 두 액터를 연결하는 "링크/무비"의 벡터가 들어있는 벡터를 포함하는 ActorNode 클래스를 갖기를 원합니다. My Link 클래스에는 두 개의 별을 연결하는 두 개의 ActorNode 포인터가 있습니다. 그리고 영화의 이름, 만든 해 그리고 나중에 나오는 것입니다 (나중에 재생 될 것입니다)

여기 내 문제는 다음과 같습니다. 내가 actorName에서 moviename movieYear 그냥 ... 모든 라인이있는 큰 텍스트 파일의 해제 그래프를 구축하고

내가 효율적으로 찾을 수와 배우 사이에 내 링크를 생성하기에 충분한 정보를 저장하고 생각하지 않는다. 나는이 문제를 구체적으로 해결할 방법을 찾고 있었다. 키가 무비 이름이되고 값이 해당 무비의 캐스트로 구성된 ActorNode 포인터 벡터 인 hashmap을 만들려고합니다. 그와 같은 무언가가 내가 믿는 바로 그 배우들 사이의 연결 고리를 만들 수있게 해줄 것입니다. ' 나는이 데이터 구조를 저장할 위치에 대해 다소 혼란 스럽다. 나는 확실히 모든 ActorNode에 대한 그래프에서 모든 영화의 모든 캐스트에 대한 해시 맵을 원하지 않습니다.

전역 변수와 같은 것을 작성하는 것이 좋지 않습니까?

+0

모든 줄에는 무엇이 있습니까? 귀하의 질문에 대한 교정 및 https://stackoverflow.com/editing-help –

+0

아를 입력 해 죄송합니다.하지만 편집을해야합니다. 모든 선은 이렇게 구성됩니다 .... 배우 이름 ... 영화 ... YEAR – KoalaIsDead

+0

게시물을 편집하고 오류를 수정하십시오. ** http://stackoverflow.com/editing-help**을 읽으십시오. –

답변

0

두 개의지도 (해시 또는 다른 다양성), 어떤 종류의 액터 이름을 Actor 데이터 구조에 매핑하고, 다른 하나는 Movie 데이터 구조의 일종으로 매핑하는 것이 좋습니다. ActorMove은지도의 존재를 알 필요가 없습니다.

지도를 계산하고 반환하는 함수에서지도 로컬 변수를 모두 만들 수 있습니다. 함수가 반환되면지도가 자동으로 소멸됩니다. 그러나 그래프의 모든 노드에 대한 포인터를 보유 할 수있는 데이터 구조가 필요합니다. 이를위한 별도의 포인터 벡터를 작성할 수 있습니다. 그러나지도 자체는 완벽하게 유용하며 그래프가 준비되면 배우와 영화를 찾는 추가 목적을 수행합니다. 여기

이 (이 토론에 필수적인 검증되지 않은 의사 만 부분)처럼 보일 수있는 방법은 다음과 같습니다 원칙적으로

class Movie; 

class Actor { 
    std::string name; 
    std::vector<Movie*> career; 
}; 

class Movie { 
    std::string title; 
    std::vector<Actor*> cast; 
}; 

class Graph { 
    std::unordered_map<std::string, std::unique_ptr<Actor>> actors; 
    std::unordered_map<std::string, std::unique_ptr<Movie>> movies; 
}; 

이이 그래프를 나타냅니다. 두 종류의 노드는 영화와 배우의 두 부분으로 된 그래프라는 사실을 암시합니다. 원래 영화를 가장자리로 원했던 그래프는 아니지만 거의 수정하지 않고 Dijkstra 또는 다른 그래프 알고리즘을 적용 할 수 있습니다.

원하는 경우이 이진 그래프에서 의도 한 그래프의 실제 표현을 만들 수 있습니다. 각 영화에 액터의 각 쌍에 대한 링크를 추가하기 만하면됩니다. 그러나 링크를 열거하기를 원할 때마다 Movie 노드를 직접 사용할 수 있기 때문에 중복 될 수 있습니다.

+0

재밌 네요. 이것은 내가 처음에 생각해 냈던 것과 동일하며, 어떤 사람들은 내가하고있는 일 때문에 잔인하다고 말했다. 그래서 나는 내가 여기 게시 한 것을 생각해 냈다. 정렬되지 않은지도가 키와 액터 포인터 및 동영상 포인터로 문자열을 보유한다는 것을 제외하고는 내 독창적 인 아이디어가 귀하의 것과 같았습니다. 나는 unique_ptr에 익숙하지 않다. 이 아이디어를 사용하여 들었던 문제는 많은 정보를 중복 저장한다는 것입니다. 제 두 번째 아이디어에 문제가 있습니다. 나는 충분한 정보를 분명히 저장하지 못하고 있습니다. 어쩌면 아플 그냥 내 원래의 생각으로 돌아갈 수 있습니다. 고맙습니다. – KoalaIsDead

+0

그 아이디어로 해결할 수 없었던 다른 문제는 액터와 벡터 클래스만으로 그래프를 탐색 할 수 있고 실제로 그래프 클래스가 필요하지 않은 것 같은 느낌입니다. 내 그래프를 트래버스하기 위해 정렬되지 않은 맵은 필요하지 않지만 지금은 이해하기 시작하고 있다고 생각하지만 적어도 그래프를 작성하는 것이 확실하다. 어쩌면 나는 아직 (100 % 확신하지 못했지만) 아직 순회를 위해지도를 필요로 할 것이다. 그러나 만약 내가 필요하지 않으면 어쩌면 나는 스택에 내지도를 만들고 그래프를 만든 후에 지울 수있다. . 그냥 큰 소리로 생각해라. 다시 한 번 감사드립니다 – KoalaIsDead

+0

unique_ptr은이 경우 일반 포인터보다 나은 대안입니다. 익숙해 져야하지만 일반 포인터도 사용할 수 있습니다. "내 순서가없는지도가 내 그래프를 가로 지르지 않아도 되겠지만 지금은 이해하기 시작하고 있다고 생각합니다.하지만 적어도 그래프를 빌드하는 것이 확실합니다."- 정확히 말하면. 지도 중 하나를 벡터로 변환하고 두지도를 모두 제거 할 수 있습니다. 벡터는 그래프를 가로 지르는 데 충분합니다. 그래도 다른 목적으로지도를 보관하고 싶을 수 있습니다. 대화 형 프로그램을 작성하면 사용자는 name/title을 사용하여 조회 할 수 있습니다. –