두 목록을 비교하고 흔하지 않은 요소를 식별하는 빠른 방법두 목록을 비교하고 다른 목록 요소(즉, 일반적이지 않은 요소)를 식별하는 빠른 방법을 아는 사람이 있습니까?두 개의 중첩된 루프를 사용하여 이 작업을 수행할 수 있지만 JSL의 많은 기능과 마찬가지로 모호하고 더 쉬운 방법이 있기를 바랐습니다. 디제이
내 목록은 물론 이보다 훨씬 더 큽니다.
list1={"사과","배","오렌지","키위","수박"};
list2={"사과","배","오렌지","키위","딸기","수박"};
다르거나 흔하지 않은 요소(이 경우에는 "딸기")를 찾습니다.
Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?다양한 크기와 다양한 JSL 루프 접근 방식에 대해 벤치마킹해야 합니다. 연관 배열을 사용하면 세트의 항목 2~10개 정도가 더 빠를 것 같습니다. 크기 1에서는 연관 배열이 과도하지만 여전히 매우 빠르게 구성됩니다. 초당 약 백만 개 정도입니다.
start = tickseconds();
for(i=1,i<=1e6,i++,
a=associativearray({"a","b"});
b=associativearray({"a","b"});
c=associativearray({"a","b"});
d=associativearray({"a","b"});
e=associativearray({"a","b"});
);
stop=tickseconds();
aatime=(stop-start);
write("\!ntime for 5,000,000 associative arrays:",aatime);
start = tickseconds();
for(i=1,i<=1e6,i++,
a=1;
b=2;
c=3;
d=4;
e=5;
);
stop=tickseconds();
satime=(stop-start);
write("\!ntime for 5,000,000 simple assingments:",satime);
write("\!nsimple/associative=", satime/aatime);
/*:
time for 5,000,000 associative arrays:5.8166666666657
time for 5,000,000 simple assingments:0.283333333325572
simple/associative=0.0487106017178716
생성한 각 연관 배열에 대해 약 20-30개 이상의 간단한 JSL 문을 실행할 수 없을 것입니다.
Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?이에 대한 빠른 질문은 연관 배열과 루프를 사용하여 절약된 시간이 연관 배열과 목록을 만드는 데 걸리는 오버헤드보다 항상 더 큽니까?
Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?그리고 흔하지 않은 방법은 교차점을 먼저 찾을 필요가 없습니다. 단지 차이점일 뿐입니다.
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
uncommon1 = set1; uncommon1<<REMOVE></REMOVE>Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?또한: 집합의 구성원이 1부터 시작하여 연속적인 정수로 명명된 경우 이 문제는 행렬을 사용하여 매우 효율적으로 수행될 수 있습니다. 그러나 명명된 집합 멤버로 제시된 것처럼 연관 배열은 아마도 정렬보다 낫고 N^2 쌍의 중첩 루프보다 확실히 낫습니다.
Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
set3=associativearray({"apple","pear","watermelon"});
intersection=set1;intersection<<INTERSECT></INTERSECT>
"common (intersection) items:"
{"apple", "kiwi", "orange", "watermelon"}
"all (union) items"
{"apple", "grape", "kiwi", "orange", "pear", "strawberry", "watermelon"}
set1HasSet3 << Contains(set3) = 0;
set2HasSet3 << Contains(set3) = 1;
연관 배열은 수백만 개의 값에 대해 매우 유용하며, 특히 수백만 개의 값을 반복하는 JSL 스크립트를 작성하는 것과 비교할 때 더욱 그렇습니다.
스크립팅 인덱스에는 세트로 사용되는 연관 배열에 대한 세부 정보가 있습니다. 다음은 흔하지 않은 항목입니다.
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
intersection=set1;intersection<<INTERSECT></INTERSECT>
Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?@ms :
귀하가 제공한 이 솔루션은 지금까지 여러 가지 면에서 나에게 큰 도움이 되었으며 먼저 이에 대해 감사를 표하고 싶습니다.
또한 우리가 매우 큰 데이터 세트(예: 각각 200만 개의 항목)를 처리할 때 이 접근 방식에는 많은 양의 메모리가 필요하며 요소를 새 테이블에 삽입하는 것이 효율적이지 않은 것 같습니다. 두 데이터 테이블의 두 열 사이에 있는 일반적이지 않은 요소를 식별하는 더 효과적인 방법이 있습니까? 즉, 데이터 테이블 1(dt1)의 열 1과 데이터 테이블 2(dt2)의 열 1에 큰 숫자 목록이 있는 경우 이를 비교할 수 있습니까? 더 효과적인 방법은?
최상의
오늘
Re: 두 목록(흔하지 않은 요소)을 비교하는 빠른 방법은 무엇입니까?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />나도 그것을 알고 싶습니다. 공통 항목은 Intersect()(아래 참조)를 사용하여 찾을 수 있지만 흔하지 않은 항목에 해당하는 기능을 알지 못합니다.
목록보다 데이터 테이블에 대한 옵션이 더 많습니다. 아래 스크립트는 임시 데이터 테이블을 통해 일반적이지 않은 요소를 식별합니다. 긴 목록을 반복하는 것보다 빠를 수 있지만 비교하지는 않았습니다.
목록1 = { "사과" , "배" , "주황색" , "키위" , "수박" , "망고" } ;
목록 2 = { "사과" , "배" , "키위" , "주황색" , "딸기" , "수박" , "멜론" } ;
dt = 새 테이블 ( "온도" ,
새 열 ( "그" , 성격 , 설정값 ( 목록1 || 목록 2 ) ) ,
새 열 ( "nr" , 숫자 , 공식 ( 1 ) , 평가식 ) ,
보이지 않는
) ;
요약하다 ( g = ~에 의해 ( dt : gr ) , N = 세다 ( dt : nr ) ) ;
흔하지 않은 = g [ 위치 ( 목록으로 ( N ) , 1 )] ;
흔한 = 연관 배열 ( 목록1 ) << 교차하다 ( 연관 배열 ( 목록 2 ) ) << getkeys ;
보여주다 ( 흔한 , 흔하지 않은 ) ;
닫다 ( dt , 노세이브 ) ;