분류 전체보기 779

[ 개념 ] 51. LIS(Longest Increasing Subsequence)

Longest Increasing Subsequence) 최장 증가 부분 수열 임의의 수열이 주어졌을 때, 이 수열에서 몇 개의 수 들을 선택해 부분수열을 만들 수 있는데, 이 때 만들어진 부분수열 중 오름차순으로 정렬 된 가장 긴 수열을 최장 증가 수열이라고 한다. 여기서의 부분 수열은 반드시 연속적이거나 유일하지 않아도 된다. 예를 들어 arr[ ] = {10, 20, 10, 30, 20, 50}의 수열이 있다고 할 때 여기서의 LIS는 {10, 20, 30, 50}이고 길이는 4일 것이다. 이제 이를 O(N2)과 O(nlogn)의 시간복잡도를 가지는 두 가지 방법을 알아보자. 1. DP 풀이 과정은 아래와 같다. i번째 인덱스에서 끝나는 최장 증가 부분 수열의 마지막에 arr[k]를 추가했을 때의 ..

[ 개념 ] 50. Levenshtein(편집 거리) 알고리즘

> Levenshtein 알고리즘 편집 거리 알고리즘 (edit distance) Levenshtein distance 는 string 간 형태적 유사도를 정의하는 척도입니다. 만약 우리가 단어 사전을 가지고 있고, 사전에 등록되지 않은 단어가 발생한다면 Levenshtein distance 가 가장 가까운 단어로 치환함으로써 오탈자를 교정할 수 있습니다. 그러나 Levenshtein distance 는 계산 비용이 비쌉니다. 이 때 간단한 inverted index 를 이용하여 비슷할 가능성이 있는 단어 후보만을 추린 뒤 몇 번의 Levenshtein distance 를 계산함으로써 효율적으로 오탈자를 교정할 수 있습니다. String 간의 형태적 유사도를 정의하는 척도를 string distance ..

[ RTOS ] 02. ThreadX의 Thread Execution

이번 글은 RTOS의 중요한 기능중 하나인 Thread에 대해 다룰 것이므로 주의 깊게 보시기를 추천드립니다 Thread Execution Scheduling and executing application threads is the most important activity of ThreadX. What exactly is a thread? A thread is typically defined as semi-independent program segment with a dedicated purpose. The combined processing of all threads makes an application. How are threads created? Threads are created dynamica..

[ 개념 ] 49. LCS(Longest Common Subsequence)

Longest Common Subsequence 최장 공통 부분 수열 여기서 substring은 연속된 부분 문자열이고, subsequence는 연속적이지 않은 부분 수열이다. 예로, "iamstudent" 라는 문자열에서 연속된 부분 문자열 mstu은 substring이 되고 연속적으로 이어지지는 않지만 순서는 맞는 mtue는 subsequence가 된다. 그렇다면 공통 부분 수열이란, 두 문자열이 공통으로 가지고 있는 부분 수열이다. 에를 들어 "CDABE" 와 "CDEGT"가 있다면 공통부분 수열은 {}, {C}, {D}, {E}, {C, D}, {D, E}, {C, E}, {C, D, E} 일 것이다. 최장 공통 부분 수열이란 공통 부분 수열 중에서 길이가 가장 긴 부분 수열을 뜻한다. 대표적으로..

[ RTOS ] 01. ThreadX의 Initialization

Understanding the initialization process is very important. The initial hardware environment is setup here. In addition, this is where the application is given its initial personality. ThreadX attempts to utilize (whenever possible) the complete development tool’s initialization process. This makes it easier to upgrade to new versions of the development tools in the future. 초기화 프로세스를 이해하는 것은 매우 ..

[ Embedded ] 26. SMP 란?

SMP Symmetric Multiprocessing - 대칭형 다중 처리 "SMP ( Symmetric Multiprocessing ) 는 둘 이상의 동일한 프로세서가 단일 공유 주 메모리 에 연결되고 모든 I / O 장치에 대한 전체 액세스 권한을 가지며 처리하는 단일 운영 체제 인스턴스에 의해 제어되는 다중 프로세서 컴퓨터 하드웨어 및 소프트웨어 아키텍처 를 포함합니다 모든 프로세서는 동등하게 특별한 목적을 위해 아무 것도 예약하지 않습니다. 오늘날 대부분의 멀티 프로세서 시스템은 SMP 아키텍처를 사용합니다. 의 경우 멀티 코어 프로세서 의 SMP 아키텍처는 별도의 프로세서로 처리, 코어에 적용됩니다." 라고 정의되어 있다. 위 그림과 같아 프로세서들은 System Bus와 Memory, I/O를..

[ ARM ] 01. 모든 개발자가 ARM 프로세서를 배워야 하는 이유

01. 모든 개발자가 ARM 프로세서를 배워야 하는 이유 이제 조금 더 깊게 들어가서 왜 임베디드개발자 혹은 일반개발자들도 ARM 프로세서를 배워야 하는지 알아보자. 임베디드 개발자가 ARM 프로세서를 배워야 하는 이유 보드 브링업을 제대로 수행하기 위해 임베디드 개발자들이 진행하는 프로젝트의 단계는 보드 브링업 - 기능안정화 - 유지보수 정도로 분류될 수 있다. 이 중 보드 브링업단계에서는 구체적으로 어떤 일을 할까? 부트로더에서 스타트업 코드를 작성 스타트업코드란 전원이 시스템에 들어오면 가장먼저 실행되는 주소에 코드를 위치시켜서 시스템을 초기화하는 코드이다. 스타트업 코드는 기본적인 메모리 설정을 초기화하고 ARM 모드 별로 스택 사이즈를 지정해야 한다 이 스타트업 코드를 제대로 작성하기 위해선 A..

[ ARM ] 00. ARM 프로세서와 우리가 이를 배워야 하는 이유

00. ARM 프로세서 ARM 아키텍쳐가 무엇인지 모르는 사람은 아래 포스팅을 보고 오시길 바란다. https://ko.wikipedia.org/wiki/ARM_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98 https://m.blog.naver.com/PostView.nhn?blogId=suresofttech&logNo=221249244004&proxyReferer=https:%2F%2Fwww.google.com%2F 그렇다면 ARM 프로세서를 배워야 하는 이유가 무엇일까? 많은 소형기기에서 ARM 프로세서를 탑재 ARM 프로세스를 배우는 가장 큰 이유는 ARM 프로세서를 많이 사용하기 때문이다. 대부분의 휴대기기에는 ARM 프로세서가 탑재돼 있다. 우리가 항상 들고다니는 안드로이드 ..

[ Embedded ] 25. Quota

Quota 쿼터란 파일시스템마다 사용자나 그룹이 생성할 수 있는 파일의 용량과 개수를 제한하는 것. 리눅스는 여러명의 사용자가 동시에 접속해서 사용할 수 있는데 만약 A라는 사욪아가 시스템을 사용할 때, 루트(/) 파일 시스템에 큰 파일을 계속 생성해서 하드디스크가 꽉차면 시스템 전체가 가동되지 않게 된다. 이런 상황을 대비하기 위해 각 사용자별로 사용할 수 있는 용량을 제한해야하는데 이것이 바로 쿼터이다. ex) 사용자 두명을 생성하고, 그 사용자들에게 각각 사용할 수 있는 공간을 할당해서 제안하기 하드디스크를 하나 장착하고 파티션을 나눈 후, 파일시스템을 ext3로 포맷하고, 마운트까지 하기. 먼저 파티션을 나누어야 한다. 그다음 ext3으로 포맷을 한다. 마운트를 시킨다. 부팅이되면 그때마다 자동으..

[ Embedded ] 24. Segment(세그먼트)

Segment(세그먼트) C언어로 작성된 프로그램은 주기억장치를 효율적으로 운영하리 위해서 일정한 크기, 대개는 64kb크기로 논리적 단위로 나누어서 할당과 할당 해제로 관리하게 된다. 그 논리적 단위를 세그먼트(Segment)라 하고 서로 관련이 있는 데이터와 명령어를 하나의 세그먼트로 관리하는 것이 아니라 데이터를 저장하는 데이터 세그먼트(Data Segment)영역와 명령어를 저장하는 코드 세그먼트 (Code Segment)영역로 구분해서 사용한다. 또한 데이터 세그먼트영역은 기억 장소의 할당 방법에 따라 동적 할당 (Dynamic Allocation)에 의하여 관리되는 스택(Stack) 세그먼트, 힙(Heap) 세그먼트와 정적 할당(Static Allocation)에 의해서 관리되어지는 데이터(D..

[ Linux Kernel ] 32. 콜 스택(Call Stack)

32. 콜 스택(Call Stack) 실행 중인 코드를 추적하는 공간이 콜스택 => 함수(function)의 호출(call)을 기록하는 스택(stack) 자료구조 콜 스택(call stack)이란 컴퓨터 프로그램에서 현재 실행 중인 서브루틴에 관한 정보를 저장하는 스택 자료구조이다. 실행 스택(execution stack), 제어 스택(control stack), 런타인 스택(run-time), 기계 스택(machine stack)이라고도 하며, 그냥 줄여서 스택(stack)이라고도 한다. 소프트웨어 프로그램의 기능 수행에 있어 콜 스택의 관리가 중요함에도 불구하고, 상세한 구현은 고급 프로그래미이 언어에서는 보통 감추어지며 자동화되어 있따. 많은 컴퓨터들이 스택 관리를 위한 특별한 명령어(기계어)를 제..

[ C++ ] 14. STL 컨테이너

STL 컨테이너 컨테이너(Container)는 다른 객체들을(원소) 보관하는 하나의 커다란 보관소라고 볼 수 있다. 특히, STL 컨테이너는 클래스 템플릿(class template) 의 형태로 구현되어 있기 때문에 임의의 타입의 원소들을 위한 컨테이너를 만들 수 있다. 물론 한 컨테이너에는 한 가지 종류의 객체들만 보관할 수 있다 컨테이너는 자신이 보관하는 원소(element)들의 메모리를 관리하며, 각각의 원소에 접근할 수 있도록 멤버 함수를 제공해준다. 컨테이서 상에서 원소에 접근하는 방법으로 크게 두 가지가 있는데, 하나는 직접 함수를 호출해서 접근하는 것이고, 다른 하나는 반복자(iterator) 을 이용해서 접근하는 것이다. 이에 관해서는 나중에 설명하도록 하겠다. 또한 표준 라이브러리에서는,..