Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ab6f21d

Browse files
committed
"Find Median from Data Stream": dynamic resize for heap
1 parent 1368357 commit ab6f21d

File tree

1 file changed

+27
-16
lines changed

1 file changed

+27
-16
lines changed

‎src/295.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#include <stdio.h>
22
#include <stdlib.h>
33

4-
static const int MAXN = 102400;
5-
64
struct MedianFinder {
75
int *maxHeap; /* store the smaller half */
86
int *minHeap; /* store the larger half */
7+
int maxHeapCapacity;
8+
int minHeapCapacity;
99
int maxHeapSize;
1010
int minHeapSize;
1111
double medium;
@@ -17,11 +17,20 @@ void swap(int *a, int *b) {
1717
*b = c;
1818
}
1919

20-
void addheap(int *heap, int *size, int data) {
21-
if (*size < MAXN - 1) {
22-
heap[*size] = data;
23-
(*size)++;
20+
void addHeap(int **heap, int *size, int *capacity, int data) {
21+
if (*size == *capacity) {
22+
int new_capacity = (*capacity) * 2; /* resize */
23+
int *newHeap = (int *)malloc(new_capacity * sizeof(int));
24+
for (int i = 0; i < *capacity; i++) {
25+
newHeap[i] = (*heap)[i];
26+
}
27+
if (*heap)
28+
free(*heap);
29+
*heap = newHeap;
30+
*capacity = new_capacity;
2431
}
32+
(*heap)[*size] = data;
33+
(*size)++;
2534
}
2635

2736
void siftUpMax(int *heap, int size) {
@@ -77,9 +86,11 @@ void siftDownMin(int *heap, int size) {
7786
/** Initialize your data structure here. */
7887
struct MedianFinder* MedianFinderCreate() {
7988
struct MedianFinder *mf = (struct MedianFinder *)malloc(sizeof(struct MedianFinder));
80-
mf->maxHeap = (int *)malloc(MAXN * sizeof(int));
81-
mf->minHeap = (int *)malloc(MAXN * sizeof(int));
89+
mf->maxHeap = (int *)malloc(sizeof(int));
90+
mf->minHeap = (int *)malloc(sizeof(int));
91+
mf->maxHeap[0] = mf->minHeap[0] = 0;
8292
mf->minHeapSize = mf->maxHeapSize = 0;
93+
mf->minHeapCapacity = mf->maxHeapCapacity = 1;
8394
mf->medium = 0;
8495
return mf;
8596
}
@@ -90,33 +101,33 @@ void addNum(struct MedianFinder* mf, int num) {
90101

91102
if (mf->maxHeapSize == mf->minHeapSize) {
92103
if (num > mf->medium) {
93-
addheap(mf->minHeap, &mf->minHeapSize, num);
104+
addHeap(&mf->minHeap, &mf->minHeapSize, &mf->minHeapCapacity, num);
94105
siftUpMin(mf->minHeap, mf->minHeapSize);
95106
mf->medium = mf->minHeap[0];
96107
}
97108
else {
98-
addheap(mf->maxHeap, &mf->maxHeapSize, num);
109+
addHeap(&mf->maxHeap, &mf->maxHeapSize, &mf->maxHeapCapacity, num);
99110
siftUpMax(mf->maxHeap, mf->maxHeapSize);
100111
mf->medium = mf->maxHeap[0];
101112
}
102113
}
103114
else {
104115
if (num > mf->minHeap[0]) {
105-
addheap(mf->minHeap, &mf->minHeapSize, num);
116+
addHeap(&mf->minHeap, &mf->minHeapSize, &mf->minHeapCapacity, num);
106117
siftUpMin(mf->minHeap, mf->minHeapSize);
107118
if (mf->minHeapSize >= mf->maxHeapSize + 2) {
108-
addheap(mf->maxHeap, &mf->maxHeapSize, mf->minHeap[0]);
119+
addHeap(&mf->maxHeap, &mf->maxHeapSize, &mf->maxHeapCapacity, mf->minHeap[0]);
109120
siftUpMax(mf->maxHeap, mf->maxHeapSize);
110121
swap(&mf->minHeap[0], &mf->minHeap[mf->minHeapSize - 1]);
111122
mf->minHeapSize--;
112123
siftDownMin(mf->minHeap, mf->minHeapSize);
113124
}
114125
}
115126
else {
116-
addheap(mf->maxHeap, &mf->maxHeapSize, num);
127+
addHeap(&mf->maxHeap, &mf->maxHeapSize, &mf->maxHeapCapacity, num);
117128
siftUpMax(mf->maxHeap, mf->maxHeapSize);
118129
if (mf->maxHeapSize >= mf->minHeapSize + 2) {
119-
addheap(mf->minHeap, &mf->minHeapSize, mf->maxHeap[0]);
130+
addHeap(&mf->minHeap, &mf->minHeapSize, &mf->minHeapCapacity, mf->maxHeap[0]);
120131
siftUpMin(mf->minHeap, mf->minHeapSize);
121132
swap(&mf->maxHeap[0], &mf->maxHeap[mf->maxHeapSize - 1]);
122133
mf->maxHeapSize--;
@@ -136,8 +147,8 @@ double findMedian(struct MedianFinder* mf) {
136147
/** Deallocates memory previously allocated for the data structure. */
137148
void MedianFinderFree(struct MedianFinder* mf) {
138149
if (mf == NULL) return;
139-
free(mf->maxHeap);
140-
free(mf->minHeap);
150+
if (mf->maxHeap) free(mf->maxHeap);
151+
if (mf->minHeap) free(mf->minHeap);
141152
free(mf);
142153
}
143154

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /