몫과 나머지 그리고 %(mod)

a, b, q, r ∈ Z 일 때,

a = bq + r, (b≠0, 0 ≤ r < |b|)

a를 b로 나눌 때 q를 몫(quotient), r을 나머지(remainder)라 한다.

그런데, C, C++, Java 혹은 그 외 다른 프로그래밍 언어에서의
a % b 연산(mod 연산)에 의한 결과로 나오는 나머지 값은
음수 값이 나오는 경우도 있다.

a와 b가 모두 양수인 경우에는 연산의 결과도 양수 값이지만
a나 b가 음수인 경우에는 각각의 프로그래밍 언어마다
(혹은 같은 프로그래밍 언에라도 구현된 컴파일러의 종류에 따라서도)
결과값이 양수인 경우도 있고 음수인 경우도 있어서 문제가 발생할 소지가 있다.

a나 b가 (혹은 a, b 모두) 음수인 경우에는 주의해서 mod 연산을 사용하자.

by 소주 | 2010/08/06 22:53 | 트랙백(1) | 덧글(0)

수직선 상 범위 체크

자료구조 내에서 선택된 데이터의 범위 overlap 문제를
수직선 상 범위 체크 문제로 변형

-- 문제 시작 --

선택된 데이터들이 (start, end) pair로 list가 저장 돼 있을 때
가장 긴 범위 순으로 몇 개를 뽑아 내려 한다.
단, 가장 큰 범위 순서대로 데이터를 하나씩 뽑을 때마다
뽑힌 데이터와 overlap이 있는 데이터는 list에서 제거한 후 남은 데이터 list에서
다시 가장 큰 범위의 데이터를 선택한다.

다시 말 해,
1. 어떤 조건을 만족하는 데이터들을 선택해서
 그 데이터들의 (start, end) pair로 구성된 하나의 list를 만든다.

2. list에서 범위가 가장 큰 데이터를 뽑는다.

3. 2번에서 뽑힌 데이터 및 그 데이터와 overlap이 있는 데이터는 모두 list에서 제거한다.

4. 필요한 갯수만큼 다 뽑을 때까지(혹은 empty list가 될 때까지) 2~3번을 반복한다.

-- 문제 끝 --


-- overlap 된 데이터 찾기 시작 --
데이터들의 (start, end) pair를 수직선 상에 mapping한다고 생각해 보자.

가장 큰 범위의 데이터 D의 (start, end)를 (L, U)라고 하자.
(즉, L=start, U=end) (L:Lower bound, U:Upper bound)

1. 임의의 데이터 d의 (start, end)를 하고 (l, u)라 하면
d가 D와 overlap이 되려면
l<=U and u>=L 이어야 한다.

2. 다시 생각해 보면,
새로운 list에는 overlap되지 않은 데이터들만 남아야 한다.
즉, l>U or u<L인 데이터들만 선택해서 새로운 list를 만들면 된다.

1과 2의 방법은 같은 결과를 낸다.
둘 중에 실제 데이터에 적용했을 때 빠른 방법을 선택하면 된다.
-- overlap 된 데이터 찾기 끝 --

-- 실제 구현은? 시작 --
start로 sorting된 list라면
l>U 혹은 l<=U인 데이터들은 금방 구할 수 있다.
end로 sorting된 list라면
u<L 혹은 u>=L인 데이터들은 금방 구할 수 있다.

각각의 기준에 의해 sorting된 list 두 개가 있으면 둘 다 쉽게 구할 수 있다.
혹은, 하나의 기준에 의해서 sorting된 list에서 한 가지의 operation을 적용하고 나서
다른 기준에 의해 정렬 후 다른 operation을 적용해도 된다
-- 실제 구현은? 끝 --

-- 문제점 시작 --
그런데 이렇게 하면 복잡도가 O(n^2)가 되어버린다.
더 좋은 방법은 없을까?
-- 문제점 끝 --

by 소주 | 2010/04/12 16:03 | 트랙백 | 덧글(0)

R의 환경 변수들 (console의 line 당 글자 수 등)

Linux console 상에서 R 작업할 때..

PuTTY Connection Manager 화면 모니터 하나에 통째로 다 차지한 상태에서
기본적인 R 환경으로 R 작업을 하다보면
R의 한 줄당 글자 출력 수가 적어서
모니터 화면이 남는 상태에서 출력 결과는 좁게 나오는 경우가 있다.

계속 해결 방법을 찾아보던 중 드디어 발견!

options(...)
getOption(x)
.Options
등을 이용하면 해결할 수 있다.

요놈들을 R의 global option들을 확인하고 setting할 수 있게 해주는 놈들.

그런데 options(...)함수가 getOptions(x)와 .Options의 기능을 다 포함하므로 options(...)만 살펴보면 되겠다.

1. 옵션 없이 options()하면 global option들을 모두 보여준다 ( .Options과 같다 )
2. options("optionName") 하면 해당 option name의 값을 보여 준다.
3. options(optionName=value) 하면 해당 option name을 value로 setting 해 준다

예)
> options()
$add.smooth
[1] TRUE

$bitmapType
[1] "cairo"

$browser
[1] "/usr/bin/mozilla"

.
.
(넘 많으므로 생략)
.
.
> options("width")
$width
[1] 80

> options(width=140)
> options("width")
$width
[1] 140


초기 width 값은 80이라
결과가 한 줄 당 80 글자밖에 출력되지 않는데
이렇게 하면 140자까지 출력되므로 화면을 넓게 쓰고
많은 출력 결과를 한 화면에서 볼 수 있다.
물론 더 많은 글자를 한 줄에 출력하게 하려면 80보다 더 큰 값으로 setting하면 된다.

그 외 다른 option들은 필요에 따라서 사용!


참고 : 1200 x 1920 해상도의 Putty Connection Manager에선 147까지 볼 수 있군.

by 소주 | 2009/10/22 11:56 | R | 트랙백 | 덧글(0)

swapon

연구실 클러스터 swapon

각각 노드에서
루트 계정으로
/sbin/swapon /dev/sda1

(fdisk /dev/sda 하고
 p 하면
 파티션 정보에 swap라고 돼 있으면 그걸 쓰면 된다던데
 연구실 꺼는 sda1 sda2 둘 다 Linux로 돼 있다.
 그래도 sda1꺼로 swap하면 잘 된다.
 어쨌든 그 하드는 다른 용도가 아니라 swap 용도로만 쓰니까..
 그럼 파티션 종류는 왜 구분 하는 거지? 그냥 확인용인가?)

by 소주 | 2009/09/21 10:52 | Linux | 트랙백 | 덧글(0)

CUI 상에서 R package 설치

Linux 터미널로 R 작업시, 즉 CUI(Character User Interface) 환경일 때
새로운 패키지를 설치하고 싶을 때가 있다
bioconductor 패키지 설치 방법은 전에 적었으므로
CRAN 패키지 설치 방법만..

일반적인 설치 방법
install.package(pkgs="패키지명")
그냥
install.package("패키지명")
이렇게 해도 똑같다.
(형식매개변수 이름을 따로 지정하지 않으면,
실매개변수가 순서대로 형식매개변수에 전해지므로)

서버에 작업할 경우 공용 패키지 디렉토리에 쓰기 권한이 없는 경우
본인의 홈 디렉토리에 설치하고 싶을 것이다.
이럴 땐
install.package(pkgs="패키지명", lib="설치할 경로")
ex) install.packages(pkgs="igraph", lib=.libPaths()[2])

참고로
> .libPaths()
[1] "/usr/lib64/R/library"
[2] "/home/bsong/R/x86_64-redhat-linux-gnu-library/2.8"
로 돼 있다.
1번은 기본 라이브러리 설치 경로이고
2번은 예전에 추가 했는데 어떻게 했는지 기억이 잘 안 난다.
(알아보고 적어 놓자.)

그러니까 위의 것은
install.packages("igraph", "/home/bsong/R/x86_64-redhat-linux-gnu-library/2.8")
과 같은 것이다.(형식 매개변수 pkgs와 lib는 역시 순서만 지킨다면 생략 가능)

다른 옵션들도 많지만 쓸 일이 별로 없으므로 생략.

by 소주 | 2009/03/26 17:09 | R | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶