"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 배열 데이터 구조에 대해 자세히 알아보기

배열 데이터 구조에 대해 자세히 알아보기

2024-09-02에 게시됨
검색:802

배열이란 무엇입니까?

  • 배열은 각 요소가 인덱스나 키로 식별되는 요소의 모음입니다.
  • 배열은 고정 및 동적 크기를 갖습니다.
  • 동종 요소 → 배열의 모든 요소는 동일한 데이터 유형입니다.
  • 이기종 요소 → 동일한 배열에서 다양한 데이터 유형을 허용합니다.
// Homogeneous 
int[] intArray = new int[5]; // Array of integers String[] 
stringArray = new String[5]; // Array of strings

// Heterogeneous
mixedArray = [1, "hello", 3.14, True]  # Mixed data types in one list

배열의 특성

  • 인덱싱: 대부분의 프로그래밍 언어에서 0부터 시작하는 인덱싱입니다.
  • 크기: ​​고정 크기(정적), 동적으로 변경할 수 없습니다(동적 배열이 있는 언어 제외).
  • 메모리 할당: 배열 요소에 대한 연속 메모리 할당입니다. 즉, 각 요소는 메모리의 이전 요소 바로 옆에 있습니다. 이는 모든 요소의 크기가 동일하므로 시스템이 해당 인덱스를 사용하여 모든 요소의 메모리 주소를 계산할 수 있기 때문에 가능합니다.

Deep dive into Array Data Structure

어레이 작업

  • 삽입: 일반적으로 요소 이동, O(n) 시간 복잡도가 포함됩니다.
  • 삭제: 삽입과 유사하게 요소를 이동해야 할 수도 있습니다. 마지막 색인 제외
  • 순회: 모든 요소를 ​​반복하며 O(n) 시간 복잡도를 갖습니다.
  • 액세스 시간: 인덱스를 사용하여 요소에 액세스하는 데 O(1) 시간 복잡도가 있습니다.

배열 유형

  • 1차원 배열: 목록과 같은 가장 간단한 형식입니다.
  • 다차원 배열: 배열의 배열(예: 2D 배열).
  • 지그재그 배열: 하위 배열의 길이가 다른 배열입니다.
  • 동적 배열(예: Java의 ArrayList): 크기가 동적으로 증가할 수 있는 배열입니다.

배열의 장점

  • 효율성: 요소에 대한 액세스 시간은 O(1)입니다.
  • 메모리 활용 : 연속적인 저장으로 메모리를 효율적으로 사용합니다.
  • 사용 편의성: 정렬 및 검색과 같은 데이터 관리 및 작업을 단순화합니다.

배열의 단점

  • 고정 크기: 선언한 후에는 크기를 변경할 수 없습니다. 동적 배열 제외
  • 삽입/삭제 비용: 특히 중간에 요소를 삽입하거나 삭제하는 경우 O(n)입니다.
  • 메모리 낭비: 사용하지 않는 요소가 여전히 공간을 차지합니다.

어레이의 실제 응용

  • 데이터 저장: 요소 컬렉션을 저장하는 프로그래밍에서는 일반적입니다.
  • 정렬 알고리즘: 많은 정렬 알고리즘이 배열용으로 설계되었습니다(예: QuickSort, MergeSort).
  • 행렬 연산: 2D 배열은 수학과 그래픽 분야의 행렬 연산에 사용됩니다.
  • 스택 및 큐 구현: 배열을 사용하여 기본 데이터 구조를 구현할 수 있습니다.

배열 모범 사례

  • 불필요한 복사 방지: 요소 복사가 필요한 작업에 주의하세요.
  • 필요할 때 동적 배열 사용: 크기가 불확실한 경우 동적 배열을 선호합니다.
  • 내장 함수 활용: 배열 작업에 언어별 함수를 활용합니다.
  • 경계 확인: IndexOutOfBoundsException을 방지하려면 항상 경계 조건을 확인하세요.

GO의 정적 및 동적 배열 예

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    // Static Array
    var staticArr [5]int64
    staticArr[0] = 1
    staticArr[1] = 2
    staticArr[2] = 3
    staticArr[3] = 4
    staticArr[4] = 5
    elementSize := unsafe.Sizeof(staticArr[0])
    totalSize := elementSize * uintptr(len(staticArr))
    fmt.Printf("Memory used by static array: %d bytes\n", totalSize)
    fmt.Println()

    // Dynamic Array (Slice)
    dynamicArr := make([]int32, 0, 5)
    before := unsafe.Sizeof(dynamicArr[0])
    beforeTotal := before * uintptr(len(dynamicArr))
    fmt.Printf("Memory used by dynamic array (before): %d bytes\n", beforeTotal)

    // Append elements to dynamic array
    for i := 0; i 




          

            
        
릴리스 선언문 이 글은 https://dev.to/chandra179/deep-dive-into-array-data-structure-1g82?1에서 복제되었습니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3