공학적이라는게 어떤거지..? 수학이 많으면 공학적인건가요? 수학을 이야기 하시는거라고 해도 컴공 3학년인데 들은 과목이 공업수학, 수치해석 밖에 없다는게 충격과 공포네요. 제가 봤을 땐 선형대수, 확률통계, 이산수학이 훨씬 중요한데.. 특히 확률통계는 필수죠. ML, NLP, IR, Computer Vision, AI 안 쓰이는데가 없어요.
학교 다니는 내내 수학이랑 씨름한 기억 밖에 없어서 공감이 잘 안 되네요. 학교나 코스웍에 따라 다른 듯.
때문에 사실 Radix는 이론쪽으로는 가장 빠른 알고리즘이나 총 n사이즈와 최대 digit의 길이를 알 수 없는 현실에서는 다른 O(nlogn)의 복잡도를 가진 정렬 알고리즘에 비해 느린경우가 많습니다. 게다가 정렬 조건이 바뀔 경우에 범용적으로 사용하지 못 해 재사용성이 몹시 떨어진다는 단점이 있어 위 예제처럼 확실한 포맷이 예쁘게 주어진 경우가 아니면 많이 사용되지는 않습니다.
Radix Sort의 시간복잡도는 O(n) 이 아니라 O(kn) 입니다. k는 리스트에 있는 숫자중 가장 큰 숫자의 digit 이구요. 예를들어서 리스트안에 [5, 12, 2, 100, 22, 51231857281928387] 이렇게 있으면 k = 17이에요. 만약 가장 큰 값을 알 수없다면 굉장히 비효율 적일 수 있겠죠. 그리고 Radix Sort에는 MSD(Most Significant Digit) 과 LSD(Least Significant Digit)이 있는데 LSD의 경우에는 가장 오른쪽 digit 부터 bucketing을 시작합니다.
만약에 전화번호 데이타 베이스라면 그장 큰 숫자가 (???) ???? - ???? 형태일테니 총 11자리를 넘어가지 않겠죠? 즉 k=11 입니다. 그리고 만약 지역번호를 기반한 데이터베이스라 이미 지역번호 세자리가 분류되어 있다면 비교해야 할 숫자는 8개로 줄겠죠 (LSD이므로) 때문에 총 시간 복잡도는 O(8*n) 이라고 할 수 있습니다. 만약 총 데이터의 수가 1000개라고 하면 8000 vs 6900 정도로 Radix가 더 느리지만 n이 커지면 커질 수록 Radix가 더 빠르겠죠
8n = nlogn 이니까 n=2980정도가 되겠네요. 데이터 총 수가 약 3000개 이상이면 (이상적으로) radix가 이득이라고 봐야겠군요 :)
일단 제가 봤을 때는 모듈을 좀 세분화 해야 할 것 같네요. 전에 다른분들이 와이파이 등 다른 모듈들을 추천하셨던 것 같은데 블루투스로 하신다면 위에 해물짬뽕님이 언급하신대로 유효거리가 상당히 짧아요.
Range may vary depending on class of radio used in an implementation:
Class 3 radios – have a range of up to 1 meter or 3 feet Class 2 radios – most commonly found in mobile devices – have a range of 10 meters or 33 feet Class 1 radios – used primarily in industrial use cases – have a range of 100 meters or 300 feet <출처: http://www.bluetooth.com/Pages/Basics.aspx>
즉 핸드폰에서 지원되는 블루투스로는 약 10미터의 유효거리를 가집니다. 참고하셔야 할 것 같고..
블루투스로 하신다면 일단 블루투스와 컴퓨터를 페어 시켜줘야 하는데 나중에 라즈베리파이에 연결하신다면 동글이 필요하겠지만, 만약 지금 컴퓨터로 테스트 하신다면 노트북의 와이파이 모듈로도 테스트 할 수 있을겁니다. 제 개인적인 생각으로는 나중에 라즈베리파이에 블루투스를 페어 시키면 또 다른 변수가 생기기 때문에 그냥 시작부터 라즈베리파이로 해 보시는게 나을 것 같다는 생각이 들긴 하지만..
아무튼 안드로이드 문서에 예제가 잘 나와있어요. 이걸 토대로 일단 전화와 컴퓨터 통신을 해 보세요. 일단 핵심은 둘 사이에 RFCOMM 커넥션을 성공 시키면 됩니다. Bluetooth basic: http://developer.android.com/guide/topics/connectivity/bluetooth.html Bluetooth를 사용한 채팅 예제: https://developer.android.com/samples/BluetoothChat/index.html
일단 둘 사이에 RFCOMM 채널이 연결 되면 안드로이드는 클라이언트 PC (혹은 라즈베리파이)는 서버 역할로 데이터를 받는데 서버쪽에서 패킷을 받는 언어는 아무거나 편한거로 하셔도 됩니다. 꼭 java가 아니어도 돼요.
이게 일단 첫번째 모듈이고, 두번째는 PC(라즈베리파이)로 서보모터를 컨트롤 하는 모듈을 만들어야겠죠. 안드로이드에서 들어오는 신호를 받는 언어가 자유롭기 때문에 제 생각에는 Python이 좋지 않을까 싶어요. 언어도 간단하고, 모터제어에 관련된 소스가 많거든요.
일단 위의 예제를 따라 해 보시면서 안드로이드와 PC간 RFCOMM채널을 개통시켜보시는게 첫번째 일일 듯 하네요.
1 앵두님이 하신 말씀을 풀어서 쓰자면, 원래 HTML5가 렌더링을 할 때 브라우저의 canvas나 DOM을 사용하잖아요. 이런 렌더링을 위한 미니멀한 HTML5 wrapper viewer를 만들어 준다는 이야기죠. 쉽게 말하면 렌더링만 해 주는 브라우저 같은 프로그램이라고 생각하시면 될 거에요. 플래쉬 뷰어처럼요. TideSDK나(http://www.tidesdk.org/) AppJS (http://appjs.com/) 등을 많이 사용하는 것 같네요~
구조체, 함수와 마찬가지로, 이미 선언하는 동시에 메모리에 할당이 됩니다. 그렇기 때문에 구조체 자신의 주소를 호출하거나(i.e., Linked List의 노드선언..), 함수 내에서 recursive하게 본인을 호출하거나 하는게 가능하지요.
Class 역시 선언과 동시에 할당이 되기 때문에, 사실상 main 함수가 호출되는 시점에서는 이미 class T가 할당이 되어 있는 상태입니다.
class T { public: T *pT; //int a = pT->data; int data; }; int main(){ T t; return 0; }
때문에 T t; 처럼 인스턴스가 생성 될 때에 사실상 class T 가 호출 될 일은 없습니다. gdb를 돌려 보시면 break T::T 를 하셔도 클래스 생성자로 step-in 하지 않을거에요. 그런데 위의 주석을 풀었을 때 처럼 포인트 pT내의 변수를 참조한다면 T가 호출 되어야 합니다. pT를 호출하지 않고서는 값을 알 수가 없으니까요. 때문에 위 주석을 풀고 gdb를 돌려보시면 T 생성자를 호출하고 a값을 할당 하는 걸 보실 수 있을겁니다.