2013-09-05 2 views
0

10000 점의 집합이 있고 서로 랜덤하게 연결되어 있다고 가정합니다. 예를 들어 10 점을 봅시다.비슷한 점의 링크 합계를 계산하십시오.

링크의 같은 번호가 포인트가 유사한 점라고 : 그리고 그들은 picture-처럼 비슷한 점의 enter image description here

정의를 연결. 그림에서 우리

노드 1 노드와 연결되어있는 비칩니다 수있다 [2] 및 [10]

노드 2가 노드에 접속되어 1}, [3], [4], [5], [6] [7], [8]

노드 3은 노드 [2]

노드 (4)에만 노드 [2]

노드 5는 단지 노드와 연결되는 연결되어 접속되어있다 [2]

노드 6은 w i 번째에만 노드는 [2]

노드 7 [2]

노드 8 노드와 연결되어있는 경우에만 노드와 접속되어있다 [2] 및 [9]

기지국 (9)은 노드 [8 접속되어 ]

노드 (10)은 노드에 연결된다 1)

그래서 이들 각각은 하나 개의 링크를 갖기 때문에 정의에 따라, 노드 - 3,4,5,6,7,9,10이 유사 . 다시 Node-1 & 8은 두 개의 링크가 있기 때문에 비슷합니다. 내 문제

는 지금은 비슷한 점의 링크의 합을 계산합니다. 예 :

노드 1은 8과 유사합니다. 노드 (1) 용

: 또한

되고 연결 (7 링크를 가짐) 기지국 (2)에 접속된다

10 노드 (이 1 링크를 가짐)

노드 8의 경우 :

노드 2에 연결됩니다. 7 링크)도

1 링크가 기지국 9()에 연결되어있다

그래서 링크가 2 군에 대해, 전체 링크의 번호 = 7 + 1 + 7되어야 +1 = 16. 이렇게하면 다른 유사한 점에 대한 전체 링크를 계산하고 싶습니다.

내 코드

여기 내 코드입니다. 그것은 각 포인트에 대한 전체 링크의 결과를 제공합니다. this-

Node 1 is connected with [2] 
Node 1 is connected with [10] 
For Node: 1 Total links: 2 

Node 2 is connected with [1] 
Node 2 is connected with [3] 
Node 2 is connected with [4] 
Node 2 is connected with [5] 
Node 2 is connected with [6] 
Node 2 is connected with [7] 
Node 2 is connected with [8] 
For Node: 2 Total links: 7 

Node 3 is connected with [2] 
For Node: 3 Total links: 1 

Node 4 is connected with [2] 
For Node: 4 Total links: 1 ... etc 

같은 결과를 생성

#include <cstdlib> 
#include <cmath> 
#include <fstream> 
#include <iostream> 
#include <vector> 


using namespace std; 

struct Node { 

    vector<int> links_to; 
    Node(void){}; 
    Node(int first_link){ 
     links_to.push_back(first_link); 
    }; 
}; 

class Links : public vector<Node> { 

public: 
    void CreateLinks(int n,int m); 
    void OutputNodes(); 

}; 

int RandGenerate(int max) { 

    return int(drand48()*double(max)); 
} 

void CreateRandom(int *nums,int m,int max) { 

    bool clear; 
    for(int i=0;i<m;i++) { 

     clear=true; 
     while(clear) { 

      clear=false; 
      nums[i]=RandGenerate(max); 
      for(int j=0;j<i;j++) { 

       if(nums[i]==nums[j]){ 
        clear=true;break; 
       } 
      } 
     } 
    } 
} 

void Links::CreateLinks(int n,int m) { 

    clear(); 
    for(int i=0;i<m;i++) { 
     push_back(Node()); 
    } 

    int edge_targets[m],nums[m]; 
    for(int i=0;i<m;i++) { 
     edge_targets[i]=i; 
    } 
    vector<int> repeated_nodes; 

    int source=m; 
    while(source<n) { 

     push_back(Node()); 
     Node &node=*(end()-1); 
     for(int i=0;i<m;i++) { 

      node.links_to.push_back(edge_targets[i]); 
      at(edge_targets[i]).links_to.push_back(source); 
      repeated_nodes.push_back(edge_targets[i]); 
      repeated_nodes.push_back(source); 
     } 

     CreateRandom(nums,m,repeated_nodes.size()); 
     for(int i=0;i<m;i++) { 
      edge_targets[i]=repeated_nodes[nums[i]]; 
     } 
     source++; 
    } 
} 

void Links::OutputNodes() { 

    for(int i=0;i<size();i++){ 
     cout<<endl; 

     for(int j=0;j<at(i).links_to.size();j++){ 

      cout<<"Node "<<(i+1)<<" is connected with ["<<(at(i).links_to[j]+1)<<"]"<<endl; 


     } 

     cout<<"For Node: "<<(i+1)<<"\t"<<"Total links: "<<at(i).links_to.size()<<endl; 
    } 
} 



int main() { 



    srand48(46574621); 
    Links network; 

    network.CreateLinks(10,1); //(nodes,minimum value of link) 
    network.OutputNodes(); 

    return 0; 
} 

나는 그 그룹 유사한 점을 수 있도록 기능을 추가 할 각 그룹의 전체 링크의 출력을 제공한다. 어떻게해야합니까?

는 Pixelchemist의 대답에 응답 업데이트

의 내가 this-

1 2 
1 10 
2 1 
2 3 
2 4 
2 5 
2 6 
2 7 
2 8...etc 

같은 파일 이름 "MyLinks.txt"의 데이터를 저장 말할 그리고 파일에서 입력을하자 . 다음은 텍스트 파일에 '연결'의 결과를 저장하고의 값을 얻으려고,

int main (void) 
{ 
ifstream inputFile("MyLinks.txt"); 
double Temp[2]; 
Links links_object; 
while (true) { 
    for (unsigned i = 0; i < 2; i++){ 
    inputFile>>Temp[i]; 
} 
    for (size_t i(0u); i<10; ++i) 
    { 
    links_object.add(Node()); 
    } 

    links_object.link_nodes(Temp[0], Temp[1]); 
    /* 
    links_object.link_nodes(0u, 9u); 
    links_object.link_nodes(1u, 2u); 
    links_object.link_nodes(1u, 3u); 
    links_object.link_nodes(1u, 4u); 
    links_object.link_nodes(1u, 5u); 
    links_object.link_nodes(1u, 6u); 
    links_object.link_nodes(1u, 7u); 
    links_object.link_nodes(7u, 8u); 
    */ 
} 

    std::vector<size_t> linksum; 
    for (auto const & node : links_object.nodes()) 
    { 
    size_t const linksum_index(node.links().size()-1u); 
    if (linksum.size() < node.links().size()) 
    { 
     size_t const nls(node.links().size()); 
     for (size_t i(linksum.size()); i<nls; ++i) 
     { 
     linksum.push_back(0u); 
     } 
    } 
    for (auto linked : node.links()) 
    { 
     linksum[linksum_index] += linked->links().size(); 
    } 
    } 

    for (size_t i(0u); i<linksum.size(); ++i) 
    { 
    std::cout << "Sum of secondary links with " << i+1; 
    std::cout << "-link nodes is: " << linksum[i] << std::endl; 
    } 
} 

내 코드를 업데이트 날짜 코드 -입니다. 그러나 이제는 세그먼트 분할 오류가 발생합니다. 어떻게 해결할 수 있습니까?

답변

0

지도를 사용합니다. 링크의 수는 키이며 그 값은 해당 수의 링크가있는 노드의 ID를 포함하는 벡터가됩니다.

typedef std::map<size_t,std::vector<size_t> SimilarNodeMap; 

SimilarNodeMap myMap; 

... // fill up the map 

for (SimilarNodeMap::iterator it=mymap.begin(); it!=mymap.end(); ++it) 
{ 
    std::cout << "Nodes with " it->first << " links: "; 

    for (size_t i = 0; i < second->size(); ++i) 
    { 
    std::cout << second->at(i) << std::endl; 
    } 
} 
0

"쌍"의 일부인 노드를 거쳐 목록에 넣을 수 있습니다. 목록에 이미 추가하려고하는 요소가 있으면 추가하지 마십시오 (e.x if 문 확인). 모든 요소를 ​​검토 한 후 목록 크기를 확인하면 링크 여야합니다.

내가 묻는 질문이 아닌 경우이를 수정하십시오.

나는 이것을 할 수있는 더 좋은 방법이있을 것이라고 확신합니다. 이것의 복잡성은 O (n^2) 시간이라고 생각합니다.

+0

약 10,000 개의 노드를 계산하고 싶습니다.그래서 if 문은 각각 얼마나 많은 링크가 생성되는지를 알 수 없으므로 좋은 생각이 아닙니다. – aries0152

0

나는 std::vector<size_t>을 사용할 것입니다. 여기서 벡터의 색인은 해당 노드 유형의 링크 수입니다.

모든 노드를 반복하고이 노드의 링크 수에 해당하는 항목을 현재 노드에 연결된 모든 노드의 링크 수로 늘립니다.

이 코드 :

#include <vector> 
#include <stdexcept> 

class Node 
{ 
    std::vector< Node const * > m_links; 
public: 
    Node(void) { } 
    void link_to (Node const &n) 
    { 
    m_links.push_back(&n); 
    } 
    std::vector< Node const * > const & links (void) const 
    { 
    return m_links; 
    } 
}; 

class Links 
{ 
    std::vector<Node> m_nodes; 
public: 
    void add (Node const &node) { m_nodes.push_back(node); } 
    void link_nodes (size_t node_a, size_t node_b) 
    { 
    size_t ns(m_nodes.size()); 
    if (node_a >= ns || node_b >= ns) 
    { 
     throw std::logic_error("Requested invalid link."); 
    } 
    m_nodes[node_a].link_to(m_nodes[node_b]); 
    m_nodes[node_b].link_to(m_nodes[node_a]); 
    } 
    std::vector<Node> const & nodes (void) const 
    { 
    return m_nodes; 
    } 
}; 

int main (void) 
{ 
    Links links_object; 
    for (size_t i(0u); i<10; ++i) 
    { 
    links_object.add(Node()); 
    } 

    links_object.link_nodes(0u, 1u); 
    links_object.link_nodes(0u, 9u); 
    links_object.link_nodes(1u, 2u); 
    links_object.link_nodes(1u, 3u); 
    links_object.link_nodes(1u, 4u); 
    links_object.link_nodes(1u, 5u); 
    links_object.link_nodes(1u, 6u); 
    links_object.link_nodes(1u, 7u); 
    links_object.link_nodes(7u, 8u); 

    std::vector<size_t> linksum; 
    for (auto const & node : links_object.nodes()) 
    { 
    size_t const linksum_index(node.links().size()-1u); 
    if (linksum.size() < node.links().size()) 
    { 
     size_t const nls(node.links().size()); 
     for (size_t i(linksum.size()); i<nls; ++i) 
     { 
     linksum.push_back(0u); 
     } 
    } 
    for (auto linked : node.links()) 
    { 
     linksum[linksum_index] += linked->links().size(); 
    } 
    } 

    for (size_t i(0u); i<linksum.size(); ++i) 
    { 
    std::cout << "Sum of secondary links with " << i+1; 
    std::cout << "-link nodes is: " << linksum[i] << std::endl; 
    } 
} 

인쇄 :

Sum of secondary links with 1-link nodes is: 39 
Sum of secondary links with 2-link nodes is: 16 
Sum of secondary links with 3-link nodes is: 0 
Sum of secondary links with 4-link nodes is: 0 
Sum of secondary links with 5-link nodes is: 0 
Sum of secondary links with 6-link nodes is: 0 
Sum of secondary links with 7-link nodes is: 9

당신은 생각을해야한다.

+0

약 10000 점을 확인하고 싶습니다. 그래서 데이터를 텍스트 파일에 저장하고 그 값을 가져 와서이 코드에서 사용하려고합니다. 하지만 세분화 오류가 발생합니다. 내 코드를 업데이트했습니다. 확인해주십시오. 어떻게 해결할 수 있습니까? – aries0152

+0

@ aries0152 왜 파일 I/O를하고 싶습니까? – Pixelchemist

+0

10,000 개의 노드를 확인하고 싶습니다. 당신은 links_object.link_nodes (0u, 1u)를 사용합니다; 각 노드에 대해 그래서 나는 텍스트 파일에 값을 저장하고 * links_object.link_nodes (0u, 1u); * (실제로 내 아이디어)를 사용한다고 생각했습니다. 제발 도와 주시겠습니까? 어떻게 link_object를 지정하지 않고 코드를 사용할 수 있습니까? 그들 각각? – aries0152

0

모든 노드에서 반복하여 계산할 수 있습니다. 의사 코드 :

std::map<std::size_t, std::size_t> counter; 
for each node 
    ++counter[node.links().size] 
관련 문제