복붙노트

[SCALA] 왜리스트 나쁜에 추가된다?

SCALA

왜리스트 나쁜에 추가된다?

최근 스칼라를 배우기 시작했는데, 나는 어떤 목록에 앞에 추가 : (죄수) 함수를 건너했습니다. 리스트에 추가하는 것은 성능의 O (n)를 붙이는 반면, O의 성능 (1)를 갖고 있기 때문에 "스칼라 프로그래밍"책는 더 APPEND 기능이 없다는 것을 말한다

뭔가 그냥 문에 대한 잘못된 인상을 받았는데.

없는 성능 구현에 따라인가? 단순히 앞뒤로 링크 목록을 구현하고 컨테이너의 첫 번째와 마지막 요소를 저장할 수 없습니다?

내 생각 두 번째 질문은 내가 내가 목록이있을 때, 1,2,3 말을 어떻게해야 내가 그것의 끝에 4를 추가 할 수있어 무엇인가?

해결법

  1. ==============================

    1.키는 X :: somelist하지 개의 mutate somelist를 않는다는 것입니다, 대신 x는 somelist의 모든 요소 다음에 포함 된 새 목록을 만듭니다. 이것은 O 수행 할 수 있습니다 만 새로 생성 된, 단일 연결 목록에서 x의 후계자로 설정 somelist해야하기 때문에 (1) 시간.

    키는 X :: somelist하지 개의 mutate somelist를 않는다는 것입니다, 대신 x는 somelist의 모든 요소 다음에 포함 된 새 목록을 만듭니다. 이것은 O 수행 할 수 있습니다 만 새로 생성 된, 단일 연결 목록에서 x의 후계자로 설정 somelist해야하기 때문에 (1) 시간.

    이중 연결리스트 대신 사용 된 경우, X는 somelist을 수정할 것 somelist의 머리의 전신으로 설정되어야 할 것이다. 그래서 우리는 원래 목록을 수정하지 않고 할 :: O (1)에서 할 수 있도록하려면, 우리는 단일 연결 목록을 사용할 수 있습니다.

    두 번째 질문에 대해서는 : 당신은 사용할 수 ::: 목록의 마지막에 단일 요소의 목록을 연결할 수 있습니다. 이것은 O (n)를 연산한다.

    List(1,2,3) ::: List(4)
    
  2. ==============================

    2.다른 답변이 현상에 대한 좋은 설명을 제공했다. 당신이 추가 요소로 목록을 작성하는 경우 서브 루틴의 목록에 많은 항목을 추가하거나하는 경우, 기능 관용구는,리스트의 전면에있는 항목을 cons'ing, 역순으로 목록을 구축하는 것입니다 마지막에 반전. 이 대신에 O (n²)의 당신은 O (n)의 성능을 제공합니다.

    다른 답변이 현상에 대한 좋은 설명을 제공했다. 당신이 추가 요소로 목록을 작성하는 경우 서브 루틴의 목록에 많은 항목을 추가하거나하는 경우, 기능 관용구는,리스트의 전면에있는 항목을 cons'ing, 역순으로 목록을 구축하는 것입니다 마지막에 반전. 이 대신에 O (n²)의 당신은 O (n)의 성능을 제공합니다.

  3. ==============================

    3.문제는 단지 업데이트 된 이후, 그 일을 지적 그것의 가치는 여기 변경되었습니다.

    문제는 단지 업데이트 된 이후, 그 일을 지적 그것의 가치는 여기 변경되었습니다.

    오늘의 스칼라에서, 당신은 단순히 XS를 사용할 수 있습니다 : + X는 연속 수집의 말미에 항목을 추가 할 수 있습니다. (: 스칼라의 2.8 이상 수집 작업의 많은 니모닉 XS 씁니다 콜론 컬렉션 옆에가는 것입니다.이 X +도 있습니다.)

    이 목록 또는 서열 번호의 기본 연결 구현 O (n)이 될 것입니다,하지만 당신은 벡터 또는 IndexedSeq 사용하는 경우,이 효과적으로 일정 시간이 될 것입니다. 스칼라의 벡터 아마 스칼라의 가장 유용 목록 같은 컬렉션과 달리 요즘 대부분 쓸모가 자바의 벡터.

    당신이 스칼라 2.8 이상에서 작업하는 경우, 컬렉션 소개는 절대해야 읽기입니다.

  4. ==============================

    4.그것은 단지 두 가지 작업이 필요하기 때문에 붙이는 속도가 빨라집니다 :

    그것은 단지 두 가지 작업이 필요하기 때문에 붙이는 속도가 빨라집니다 :

    당신은 머리에 대한 포인터를 갖고 있기 때문에리스트의 말미에 통과해야하기 때문에 추가 더 많은 작업을 수행해야합니다.

    내가 전에 스칼라 프로그래밍 적이 있지만 목록 버퍼 시도 할 수

  5. ==============================

    5.이 편리한 불변의 수집 유형의 대부분의 기능적인 언어로 눈에 띄게, 싱글 링크드리스트 데이터 구조를 파악. 당신은 기능적인 언어로 "목록"을 말할 때, 그건 당신이 (싱글 링크드리스트, 일반적으로 불변) 무슨 뜻인지 일반적입니다. 이러한 유형의 경우, APPEND 죄수 반면 O (N)는 O (1)이다.

    이 편리한 불변의 수집 유형의 대부분의 기능적인 언어로 눈에 띄게, 싱글 링크드리스트 데이터 구조를 파악. 당신은 기능적인 언어로 "목록"을 말할 때, 그건 당신이 (싱글 링크드리스트, 일반적으로 불변) 무슨 뜻인지 일반적입니다. 이러한 유형의 경우, APPEND 죄수 반면 O (N)는 O (1)이다.

  6. from https://stackoverflow.com/questions/1320139/why-is-appending-to-a-list-bad by cc-by-sa and MIT license