위는 예시
비전공이라 물어볼 곳도 없음.
Adjacency List는 알고 있었는데 Multilist는 정말 신박하더라
꼭 구현하고 싶은데 문제는 효율적으로 할당해제할 방법이 마땅히 안떠오름.
엣지하나만 없애는 건 링크드 리스트 지우듯이 앞에거랑 뒤엣거 잘 연결만 해주면 되니 알겠는데,
예를들어 vertex 5만에 평균 degree가 4, 8 이런 그래프를 지울 때,
어차피 다 지울 걸 하나씩 일일이 몇십만번 새로 이어주는 건 말이 안된다는 거지.
일단 생각나는 건
1. vertex하나(V1)를 집어 리스트 첫번째에 있는 edge(N1)를 stack에 넣는다.
2. 반복하기 전에 첫번째 edge가 연결하는 vertex 중 V1가 아닌 녀석 (V2)를 찾는다.
3. V2의 리스트에서 stack의 첫번째 edge N1이 나올 때 까지 따라간 뒤, 찾으면 nullptr로 바꿔준다.
4. stack의 top edge에 있는 2개의 edge( N2, N4)를 또 stack에 넣는다.
5. 양쪽모두 nullptr인 edge가 top에 올 때까지 stack에 넣는 걸 반복한다.
6. stack에 있는 edge들을 탑에서 부터 delete한다.
7. 모든 vertex에 대해 반복.
아씨 근데 쓰고나니 이젠 vertex3에서 N2에 접근할 때 이미 할당 해제된 곳에 접근하려 하겠네....
이미 해제된 memory에 또 delete를 쓰면 에러나겠지?
된다면 edge 객체의 파괴자에서 다음 edge의 파괴자도 호출하도록 하면 끝이긴 한데.
실행이 된다해도 좋은 방법은 아닌거 같음.
사실 weak pointer쓰면 깔끔한데 이건 최후의 수단으로 남기고 싶음.
훌륭하신 슨배님들 불쌍한 뉴비에게 길을 알려주세요
ps. 모든 edge를 배열에 저장해 두면 쉽지만, 길이 몇십만의 연속된 배열을 할당하는 건 좀.....
- dc official App
언어는 C++쓰고 있긴 합니다 - dc App
해당 댓글은 삭제되었습니다.
음 역시 따로 모아두는 법 뿐이가요... 엣지가 막 몇십만개 되는 그래프를 그려볼꺼라.. 뭐 벡터여러개 만들어서 분할저장하면 되겠지만... 뭔가 이렇게 하면 결국 엣지의 포인터를 2번씩 쓰게 되니 Adjacency List에 비해 장점이 없는 거 같아서요 - dc App
array같은 경우 길이 막 40만짜리 연속된 배열 만들라 하면 할당할 곳이 없어서 문제될 수도 있다던데.. 벡터는 알아서 잡아주나요? - dc App
근데 그럼 결국 일반적인 adjacency list랑 차이가 없게됨.. 아니 오히려 공간 더 차지하려나., spanning tree같이 edge에 weight를 줘야한다면 써야겠지만 - dc App
결쿡 vertex나 edge에서 다른 edge에 접근할 때 edge포인터 배열 + index로 접근하도록 해야한다는 건가 - dc App
뭐 엣지마다 따로 weight같은 값을 부여할땐 유리할 듯. - dc App
해당 댓글은 삭제되었습니다.
좋은 방법 찾음. 각 엣지에는 버텍스 2개와 그 2개의 버텍스의 연결리스트를 표현하기 위한 다음 엣지의 포인터가 있음. 버텍스 V1의 연결리스트에 있는 모든 엣지들을 stack에 넣고 다음 엣지를 가리키는 포인터들을 다 null로 바꿔줌. 그리고 두 포인터 모두 null인 엣지만 지움. 이걸 모든 버텍스에 대해 반복. - dc App
한쪽은 무조건 null넣으니 반대쪽만 넣으면 되긴 하는 데... 어느쪽인지 판단하는 로직이 있으니 매한가지긴 하네. 문제는 벡터에 포인터만 넣는 다 해도 내가 원하는 40만 개의 엣지의 포인터를 할당할 수 있는지는 시스템에 따라 미지수라는 것. 어쨌든 벡터도 array에 저장하는 거고, 메모리가 여유 있어도 40만개의 연속된 공간이 - dc App
없는 경우가 있음. 한두번 겪어봄... - dc App
ㅇㅇ 그렇긴 함. 아 씁 그냥 그렇게 해야겠다. 공간아끼자고 시간 소비하는 건 에바인듯 - dc App