Step By Step (Lua 데이터 구조)

13044 단어 데이터 구조
Lua 의 table 은 간단 한 데이터 구조 가 아니 라 다른 데이터 구조의 기초 가 될 수 있 습 니 다.예 를 들 어 배열, 기록, 선형 표, 대열 과 집합 등 은 Lua 에서 모두 table 을 통 해 표시 할 수 있다.            1. 배열:    정수 로 table 을 색인 하면 Lua 에서 배열 을 실현 할 수 있 습 니 다.따라서 Lua 의 배열 은 다음 과 같은 크기 가 고정 되 어 있 지 않 습 니 다.
1 a = {}
2 for i = 1, 1000 do
3 a[i] = 0
4 end
5 print("The length of array 'a' is " .. #a)
6 --The length of array 'a' is 1000

    Lua 에 서 는 모든 수 를 배열 의 시작 색인 으로 할 수 있 지만, 일반적으로 1 을 시작 색인 값 으로 사용 합 니 다.또한 많은 Lua 의 내장 기능 과 함 수 는 이러한 특징 에 의존 하기 때문에 충분 한 이유 가 없 는 전제 에서 이 규칙 을 최대한 보장 합 니 다.다음 방법 은 table 의 구조 기 를 통 해 배열 을 만 들 고 초기 화 하 는 것 입 니 다. 예 를 들 어:    squares = {1, 4, 9, 16, 25}    2. 2 차원 배열:    Lua 에서 우 리 는 두 가지 방식 으로 table 구조의 다 차원 배열 을 이용 할 수 있다.그 중에서 첫 번 째 방식 은 '배열 의 배열' 방식 으로 다 차원 배열 을 실현 하 는 것 이다. 즉, 1 차원 배열 의 모든 요소 도 table 대상 이다. 예 를 들 어:
1 mt = {}
2 for i = 1, N do
3 mt[i] = {}
4 for j = 1, M do
5 mt[i][j] = i * j
6 end
7 end

    두 번 째 방식 은 2 차원 배열 의 색인 을 펼 치고 고정된 상수 로 2 차원 의 보폭 으로 하 는 것 이다. 예 를 들 어:
1 mt = {}
2 for i = 1, N do
3 for j = 1, M do
4 mt[(i - 1) * M + j] = i * j
5 end
6 end

    3. 링크:    table 은 동태 적 인 실체 이기 때문에 Lua 에서 링크 를 실현 하 는 것 이 편리 합 니 다.그 중에서 모든 노드 는 table 로 표 시 됩 니 다. 하나의 '링크' 는 노드 의 한 필드 일 뿐 이 필드 는 다른 table 에 대한 인용 을 포함 합 니 다. 예 를 들 어:
 1 list = nil
2 for i = 1, 10 do
3 list = { next = list, value = i}
4 end
5
6 local l = list
7 while l do
8 print(l.value)
9 l = l.next
10 end

    4. 대기 열과 양 방향 대기 열:    Lua 에서 대기 열 을 실현 하 는 간단 한 방법 은 table 라 이브 러 리 함수 insert 와 reove 를 사용 하 는 것 입 니 다.그러나 이런 방법 은 후속 요소 의 이동 을 초래 할 수 있 기 때문에 대기 열의 데이터 양 이 비교적 많 을 때 이 방법 을 사용 하 는 것 을 권장 하지 않 는 다.아래 의 코드 는 더욱 효율 적 인 실현 방식 이다. 예 를 들 어:
 1 List = {}
2
3 function List.new()
4 return {first = 0, last = -1}
5 end
6
7 function List.pushFront(list, value)
8 local first = list.first - 1
9 list.first = first
10 list[first] = value
11 end
12
13 function List.pushBack(list, value)
14 local last = list.last + 1
15 list.last = last
16 list[last] = value
17 end
18
19 function List.popFront(list)
20 local first = list.first
21 if first > list.last then
22 error("List is empty")
23 end
24 local value = list[first]
25 list[first] = nil
26 list.first = first + 1
27 return value
28 end
29
30 function List.popBack(list)
31 local last = list.last
32 if list.first > last then
33 error("List is empty")
34 end
35 local value = list[last]
36 list[last] = nil
37 list.last = last - 1
38 return value
39 end

    5. 집합 과 가방 (Bag):    Lua 에서 table 로 집합 을 실현 하 는 것 은 매우 간단 합 니 다. 다음 코드 를 보십시오.    reserved = { ["while"] = true, ["end"] = true, ["function"] = true, }    if not reserved["while"] then        --do something    end    Lua 에 서 는 가방 (Bag) 을 MultiSet 로 볼 수 있 는데, 일반 집합 과 달리 이 용기 에 서 는 key 와 같은 원소 가 용기 에 여러 번 나타 날 수 있 도록 허용 한다.다음 코드 는 table 의 요소 에 계수 기 를 추가 하 는 방식 으로 이 데이터 구 조 를 모 의 합 니 다. 예 를 들 어:
1 function insert(bag, element)
2 bag[element] = (bag[element] or 0) + 1
3 end
4
5 function remove(bag, element)
6 local count = bag[element]
7 bag[element] = (count and count > 1) and count - 1 or nil
8 end

    6. StringBuilder:    Lua 에서 여러 문자열 을 하나의 큰 문자열 로 연결 하려 면 다음 과 같은 방식 으로 이 루어 질 수 있 습 니 다.
1 local buff = ""
2 for line in io.lines() do
3 buff = buff .. line .. "
"
4 end

    위의 코드 는 확실히 정상적으로 작업 을 완성 할 수 있 지만, 줄 수가 비교적 많 을 때, 이러한 방법 은 대량의 메모리 재분배 와 메모리 간 의 데이터 복 사 를 초래 할 수 있 으 며, 이 로 인해 가 져 오 는 성능 비용 도 상당히 상당 하 다.사실 많은 프로 그래 밍 언어 에서 String 은 자바 와 같은 가 변 대상 이 므 로 이 방식 을 통 해 큰 문자열 을 여러 번 연결 하면 같은 성능 문 제 를 일 으 킬 수 있 습 니 다.이 문 제 를 해결 하기 위해 자바 에 서 는 StringBuilder 류 를 제공 하고 Lua 에 서 는 table 의 concat 방법 으로 이 문 제 를 해결 할 수 있 습 니 다. 다음 코드 를 참조 하 십시오.
 1 local t = {}
2 for line in io.lines() do
3 t[#t + 1] = line .. "
"
4 end
5 local s = table.concat(t)
6
7 --concat , :
8 local t = {}
9 for line in io.lines() do
10 t[#t + 1] = line
11 end
12 local s = table.concat(t,"
")

좋은 웹페이지 즐겨찾기