LlListSort/ko

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

설명

함수: 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의 관련항목이 도움을 줄 수 있을 지도 모릅니다.