C#에서는 고유 한 요소 모음이 있고 각 정렬되지 않은 쌍의 코드를 효율적으로 실행하려고합니다. 예를 들어, 컨테이너가 {a, b, c}를 보유하고 있으면, 순서가없는 쌍은 (a, b), (a, c) 및 (b, c)입니다. 문제는 2-opt 최적화를 수행하는 범위에서 발생하므로 효율성이 문제입니다. 마찬가지로컬렉션에 저장된 원소의 정렬되지 않은 쌍을 반복합니다.
나의 현재 용액 같다 : 분명히
foreach(var a in container) { foreach(var b in container) { if (a < b) { // execute code } } }
, 이것은 용이하게 변형 될 수있는 연산자 []는 (i 번째 요소를 얻기 위해 사용할 수있는 경우, 즉 기본 데이터 구조가 인 경우 그러나 다른 모든 컨테이너의 경우 솔루션은 일부 비교 함수의 존재에 의존하며 그다지 효율적이지 않습니다.
각 희망 쌍을 정확히 한 번 생성하는 LINQ 문을 기반으로 한 공식을 시도했습니다. 그러나 예상대로 첫 번째 방법보다 훨씬 느립니다. 이것은
ElementAt
을 사용하는 솔루션에도 적용됩니다.
편집 :
var x = from a in container
from b in container
where a < b
select new KeyValuePair<int,int>(a,b);
여전히 실행 다른 솔루션에 비해 3-5 배 정도 느린 여기 사용 된 (개) LINQ 코드이다. 여기
- 는 ++ (좋은 효율을 얻기) 나는 C에서 그것을 할 것이 방법입니다 : Unfortunatelly
for(auto it1 = container.begin(); it1!=container.end(); ++it1) { auto it2 = it1; for(++it2; it2!=container.end(); ++it2) { // execute code } }
, C 번호로이를 변환하는, (내부적으로 사용) 에뮬레이터를 복제하는 데 필요한 것 이는 언어 자체에서 지원되지 않습니다.
더 좋은 아이디어/해결책이 있습니까?
Linq 솔루션의 모습은 무엇입니까? 어쩌면 비효율적으로 뭔가를하고있는 것일 수 있습니다. –
a
왜 LINQ 문에서 ToList()를 호출합니까? 당신이하는 일이 각 요소에 대해 각 요소 코드를 실행하고 있다면 그 목록을 할당하는 것을 절약 할 수 있습니다. –