LlListSort/ko

From Second Life Wiki
Jump to navigation Jump to search

설명

함수: list llListSort( list src, integer stride, integer ascending );
184 함수ID
0.0 지연
10.0 에너지

반환되는 값은 that is srcstride씩 자른 절편으로 나누어 정렬한 목록.

• list src 정렬되는 목록
• integer stride 절편 크기. 1보다 작으면 1로 인식된다.
• integer ascending FALSE(거짓)이면 정렬 순서는 내림차순이고, 그렇지 않으면 오름차순이다.

이 함수는 절편 목록을 지원한다.

명세

본 함수는 거품 정렬(bubble sort)로 구현되어있다.
정렬 순서는 유형의 영향을 받는다.
각각의 유형은 제각기 따로 정렬되며 다른 유형들에 대한 상대적인 위치는 변하지 않는다. <lsl>llListSort([1, "C", 3, "A", 2, "B"], 1, TRUE)은 [1, "A", 2, "B", 3, "C"]를 반환 llListSort([1, 3, 2, "C", "A", "B"], 1, TRUE)은 [1, 2, 3, "A", "B", "C"]를 반환 llListSort([1, "C", 3, "A", 2, "B"], 2, TRUE)은 [1, "C", 2, "B", 3, "A"]를 반환</lsl>

주의

거품 정렬은 시간복잡도가 대문자 O N*N인 알고리즘이다. 린든랩이 힙 정렬(heap sort)이나 합병 정렬(merge sort)과 같은 N*log(N) 복잡도의 알고리즘을 쓰지 않는 이유는 알려져 있지 않다. Jira 쟁점 추적 페이지에 이에 대한 설문이 진행 중이다.

예제

<lsl> list numbers = [3, "three", 2, "two", 1, "one"]; default {

   state_entry()
   {
       llOwnerSay(llDumpList2String(numbers, ","));
       // Object: 3,three,2,two,1,one
       numbers = llListSort(numbers, 2, TRUE);
       llOwnerSay(llDumpList2String(numbers, ","));
       // Object: 1,one,2,two,3,three
   }

} </lsl>

기록

자료형

llListSort는 같은 자료형의 항목들에 대해서만 작동된다. 여러가지 유형으로 된 목록에 대해서도 물론 작동을 하겠지만 그 결과는 대체로 무의미할 것이다.

<lsl>list mylist = ["brown", <0.000000, 0.000000, 0.000000>, "house", 17.005, 100, "cat", <3.000000, 3.000000, 3.000000>, 39]; list tmplist = llListSort(mylist,1,TRUE); llSay(0, llList2CSV(tmplist));</lsl>

이것은 다음을 출력한다:

brown, <0.000000, 0.000000, 0.000000>, cat, 17.004999, 39, house, <3.000000, 3.000000, 3.000000>, 100

결과의 활용

원본 목록은 변하지 않는다는 것에 주의해야 한다. 그 대신, 새로운 정렬된 목록이 생성되는 것이다. 따라서 (결과를 바로 사용하지 않는다면) 이것을 또 하나의 변수로 담는 것이 중요하다.

<lsl>llListSort(myList,1,TRUE); //cpu를 낭비한 셈이며 실제로 아무런 결과도 저장하지 못한다. list newlist = llListSort(myList,1,TRUE);//결과물을 저장하였다. llSay(0,llList2CSV(llSortList(myList,1,TRUE)));//이 경우는 결과를 담아둘 필요가 없다. 결과를 바로 이용하고 있다.</lsl>

Stride 매개변수

대부분은 모든 항목을 가지고 정렬하기 위해 "integer stride"를 1(혹은 0도 작동한다)로 놓게 될 것이다. (절편 목록을 다룰 것이라면 절편 목록의 정렬를 자세히 다룬 절을 자세히 볼 것.)

정렬 순서

매개변수 "integer ascending"를 TRUE로 놓으면 오름차순으로 정렬된다.
예: ["Apples", "Bananas", "Oranges"]

매개변수 "integer ascending"를 FALSE로 놓으면 내림차순으로 정렬된다.
예: ["Oranges", "Bananas", "Apples"]

절편 목록의 정렬

관계 있는 자료끼리 묶음으로 처리하기 위해 절편 목록을 사용할 때에 항목들을 모두 제각기 정렬해버린다면 재앙을 초래할 것이다.

<lsl>list demographics = ["John Adams", "male", "2007-06-22", "Shirley Bassey", "female", "2005-11-02", "Matt Damon", "male", "2008-05-19"];</lsl>

나쁜 예

<lsl>list tmplist_1 = llListSort(demographics, 1, TRUE); //tmplist_1 == ["2005-11-02", "2007-06-22", "2008-05-19", "John Adams", "Matt Damon", // "Shirley Bassey", "female", "male", "male"] //절편은 파괴되고 정렬된 자료들은 무의미해진다.</lsl>

좋은 예

대신, 묶음(소위 "절편")으로 된 자료들을 다루기 위해서는 다음과 같이 해야 한다:

<lsl>list tmplist_2 = llListSort(demographics,3,TRUE); //templist_2 = ["John Adams", "male", "2007-06-22", "Matt Damon", "male", "2008-05-19", // "Shirley Bassey", "female", "2005-11-02"] </lsl>

자료들을 절편 목록에 저장할 때는 어떻게 정렬하는 것이 가장 바람직한지, 심지어 그런 방식을 쓰는 것이 과연 필요한지 부터 살피는 것이 좋다. 해당 묶음의 첫 번째 원소들을 가지고만 정렬할 수 있음을 기억하라. 그러므로 (위의 예제에서 그랬듯이) 성별을 기준으로 우선 정렬을 하고 싶다면, 성별을 각각의 묶음에서 첫 번째 원소가 되게 하면 된다.

상세 기록

쟁점

   Change llListSort to use a faster algorithm

출처

lsa_bubble_sort(): 'linden\indra\lscript\lscript_alloc.h'

이 글이 유용하지 않으세요? LSL Wiki의 관련항목이 도움을 줄 수 있을 지도 모릅니다.