2010-01-21 2 views
2

전압 데이터의 순서를 저장할 필요가있는 응용 프로그램을 가지고, 각 항목은 쌍 {시간, 전압}타임 스탬프 된 데이터의 순서를 저장하는 방법은 무엇입니까?

시간이 반드시 연속적이지 않은 경우, 전압이 움직이지 않으면, 나는 어떤 독서가있다.

문제 나 또한 타임 스탬프 등 getVoltageOfTimestamp (float2second (922.325))

내 용액 후 매 30 초간 paires를 저장하는 양단을 갖는 것이다를 조회하는 기능을 가질 필요가있다 나는 샘플링을하고지도 표준 : 맵에 인덱스를 저장 getVoltageOfTimestamp 내부 그래서

(float2second (922.325)), 단순히 원하는 시간에 가까운 interval_of_30_seconds를 찾은 다음에 양단 큐의 내 포인터를 이동 해당 corresponding_index_of_deque, 거기에서 반복하고 올바른 전압을 찾으십시오.

더 많은 '컴퓨터 과학자'솔루션이 존재하는지 확실하지 않습니다. 아무도 저에게 단서를 줄 수 있습니까?

+0

좋은 답변을 줄 수 있으려면 메모리에 저장해야하는 통풍구가 얼마나되는지 아는 것이 재미있을 것입니다. –

+0

사람이 어떻게 입력합니까? 전형적인 시간 해상도는 무엇입니까? 데이터에 큰 "구멍"이 있습니까? 바이너리 검색이 너무 느려 집니까? –

답변

1

타임 스탬프가 오름차순이므로 std::deque에서 이진 검색을 사용할 수 있습니다.

속도를 최적화하려면 std::map<Timestamp, Voltage>을 사용할 수도 있습니다. 요소를 찾으려면 upper_bound을지도에서 사용하고 upper_bound에서 찾은 요소를 반환하십시오. 이 방법은 더 많은 메모리를 사용합니다 (std::map<Timestamp, Voltage>에 약간의 오버 헤드가 있고 각 항목을 별도로 할당하기 때문에).

1

별도의 맵을 사용하여 양면 스캔을 직접 수행하여 옷장 타임 스탬프를 찾을 수 있습니다. std :: map의 복잡성 요구 사항을 감안할 때, 바이너리 검색을 수행하는 것은 맵 검색 (둘 다 O (log N))만큼 효율적이므로 추가 오버 헤드가 필요하지 않습니다.

+0

예,하지만'std :: vector' 크기를 조정하면 값 비쌉니다. 'std :: deque'는 둘 이상의 메모리 덩어리를 사용하기 때문에 resize에 모든 값을 재 할당하고 복사 할 필요가 없습니다. – hjhill

+0

@hjhill - 좋은 지적, 나는 벡터 추천을 버리겠다. –

0

C++ ox conepts를 사용 하시겠습니까? 그렇지 않은 경우 deque<tuple<Time, Voltage>>이 작업을 수행합니다.

0

이진 검색보다 향상시킬 수있는 한 가지 방법은 데이터 샘플을 식별하는 것입니다. 귀하의 샘플이 매 30 밀리 초라고 가정하면, 벡터 /리스트에 귀하가 얻은 값을 저장하십시오. 다른 배열에서는 30 초마다 배열 색인을 삽입하십시오. 이제 타임 스탬프가 주어지면 첫 번째 배열로 이동하여 목록에있는 요소의 색인을 찾으면됩니다. 이제 그곳으로 가서 그 앞/뒤에있는 몇 가지 요소를 확인하십시오.

희망이 도움이됩니다.