Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 92d56e1

Browse files
committed
doge binary search
1 parent ed252c6 commit 92d56e1

7 files changed

Lines changed: 164 additions & 64 deletions

File tree

btree/btree.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class btree {
182182
*/
183183
std::pair<iterator, bool> insert(const T& elem);
184184
void printAll() const;
185+
size_t getTotalSize() {return totalSize;}
185186
/**
186187
* Disposes of all internal resources, which includes
187188
* the disposal of any client objects previously
@@ -212,7 +213,7 @@ class btree {
212213
std::shared_ptr<Node> getParent() const {return parent.lock();}
213214

214215
// void insertNode(size_t idx, std::shared_ptr<Node>& n) {children.at(idx) = n; }
215-
216+
216217
void insertVal(const T& elem) {
217218
elems.push_back(std::make_shared<T>(elem));
218219
}

btree/btree.tem

Lines changed: 108 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,65 @@ template<typename T> typename btree<T>::iterator btree<T>::find(const T& elem) {
156156
if (elem == result.first->getVal(result.second)) {
157157
return iterator(result.first, result.second);
158158
}
159-
return iterator(tail_, tail_->getSize()-1);
159+
return this->end();
160160
}
161161

162162
template<typename T> std::pair<typename btree<T>::Node*, size_t> btree<T>::findHelper(Node* node, const T& elem) {
163163
for (size_t i = 0; i < node->getSize(); ++i) {
164-
if (elem == node->getVal(i)) {
165-
return make_pair(node, i);
166-
} else if (elem > node->getVal(i)) {
167-
if (node -> getChild(i+1) != nullptr) {
168-
return findHelper(node->getChild(i+1).get(), elem);
164+
if (i == 0) {
165+
if (node -> getSize() == 1) {
166+
if (elem == node->getVal(0)) {
167+
return make_pair(node, 0);
168+
} else if (elem < node->getVal(0)){
169+
if (node -> getChild(0) != nullptr) {
170+
return findHelper(node->getChild(0).get(), elem);
171+
} else {
172+
return make_pair(node, 0);
173+
}
174+
} else {
175+
if (node -> getChild(1) != nullptr) {
176+
return findHelper(node->getChild(1).get(), elem);
177+
} else {
178+
return make_pair(node, 0);
179+
}
180+
}
169181
} else {
170-
return make_pair(node, node->getSize() - 1);
182+
if (elem == node->getVal(0)) {
183+
return make_pair(node, 0);
184+
} else if (elem < node->getVal(0)){
185+
if (node -> getChild(0) != nullptr) {
186+
return findHelper(node->getChild(0).get(), elem);
187+
} else {
188+
return make_pair(node, 0);
189+
}
190+
}
191+
}
192+
} else if (i == node->getSize() - 1) {
193+
if (elem == node->getVal(i)) {
194+
return make_pair(node, i);
195+
} else if (elem > node -> getVal(i)){
196+
if (node -> getLast().get() != nullptr) {
197+
return findHelper(node -> getLast().get(), elem);
198+
} else {
199+
return make_pair(node, i);
200+
}
201+
} else {
202+
// std::cout << "fucl" << node->getVal(i) << std::endl;
203+
if (node -> getChild(i) != nullptr) {
204+
return findHelper(node->getChild(i).get(), elem);
205+
} else {
206+
return make_pair(node, i);
207+
}
208+
}
209+
} else {
210+
if (elem == node->getVal(i)) {
211+
return make_pair(node, i);
212+
} else if (elem < node->getVal(i)) {
213+
if (node -> getChild(i) != nullptr) {
214+
return findHelper(node->getChild(i).get(), elem);
215+
} else {
216+
return make_pair(node, i);
217+
}
171218
}
172219
}
173220
}
@@ -176,13 +223,60 @@ template<typename T> std::pair<typename btree<T>::Node*, size_t> btree<T>::findH
176223

177224
template<typename T> std::pair<typename btree<T>::Node*, size_t> btree<T>::findHelper(Node* node, const T& elem) const {
178225
for (size_t i = 0; i < node->getSize(); ++i) {
179-
if (elem == node->getVal(i)) {
180-
return make_pair(node, i);
181-
} else if (elem > node->getVal(i)) {
182-
if (node -> getChild(i+1) != nullptr) {
183-
return findHelper(node->getChild(i+1).get(), elem);
226+
if (i == 0) {
227+
if (node -> getSize() == 1) {
228+
if (elem == node->getVal(0)) {
229+
return make_pair(node, 0);
230+
} else if (elem < node->getVal(0)){
231+
if (node -> getChild(0) != nullptr) {
232+
return findHelper(node->getChild(0).get(), elem);
233+
} else {
234+
return make_pair(node, 0);
235+
}
236+
} else {
237+
if (node -> getChild(1) != nullptr) {
238+
return findHelper(node->getChild(1).get(), elem);
239+
} else {
240+
return make_pair(node, 0);
241+
}
242+
}
184243
} else {
185-
return make_pair(node, node->getSize() - 1);
244+
if (elem == node->getVal(0)) {
245+
return make_pair(node, 0);
246+
} else if (elem < node->getVal(0)){
247+
if (node -> getChild(0) != nullptr) {
248+
return findHelper(node->getChild(0).get(), elem);
249+
} else {
250+
return make_pair(node, 0);
251+
}
252+
}
253+
}
254+
} else if (i == node->getSize() - 1) {
255+
if (elem == node->getVal(i)) {
256+
return make_pair(node, i);
257+
} else if (elem > node -> getVal(i)){
258+
if (node -> getLast().get() != nullptr) {
259+
return findHelper(node -> getLast().get(), elem);
260+
} else {
261+
return make_pair(node, i);
262+
}
263+
} else {
264+
// std::cout << "fucl" << node->getVal(i) << std::endl;
265+
if (node -> getChild(i) != nullptr) {
266+
return findHelper(node->getChild(i).get(), elem);
267+
} else {
268+
return make_pair(node, i);
269+
}
270+
}
271+
} else {
272+
if (elem == node->getVal(i)) {
273+
return make_pair(node, i);
274+
} else if (elem < node->getVal(i)) {
275+
if (node -> getChild(i) != nullptr) {
276+
return findHelper(node->getChild(i).get(), elem);
277+
} else {
278+
return make_pair(node, i);
279+
}
186280
}
187281
}
188282
}
@@ -194,7 +288,7 @@ template<typename T> typename btree<T>::const_iterator btree<T>::find(const T& e
194288
if (elem == result.first->getVal(result.second)) {
195289
return iterator(result.first, result.second);
196290
}
197-
return const_iterator(tail_, tail_->getSize()-1);
291+
return this->cend();
198292
}
199293

200294

btree/test

142 KB
Binary file not shown.

btree/test.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,28 @@ int main(void) {
4242
// initialise random number generator with 'random' seed
4343

4444
// insert lots of random numbers and compare with a known correct container
45-
btree<int> *t = new btree<int>(1);
45+
btree<int> *t = new btree<int>(3);
4646
pair<btree<int>::iterator, bool> result = t->insert(1);
47+
result = t->insert(11);
4748
result = t->insert(3);
4849

4950

5051

51-
result = t->insert(5);
52-
result = t->insert(6);
52+
53+
// result = t->insert(5);
5354
result = t->insert(6);
55+
// result = t->insert(10);
5456

55-
result = t->insert(7);
57+
// result = t->insert(7);
5658

57-
result = t->insert(9);
59+
// result = t->insert(6);
60+
// result = t->insert(9);
5861

59-
result = t->insert(10);
62+
// t->printAll();
63+
int a = 6;
6064

61-
std::cout << *(t->find(1)) << std::endl;
65+
std::cout << "is end " << (t->find(a) == t->end()) << std::endl;
66+
std::cout << *(t->find(a)) << std::endl;
6267

6368
// result = t->insert(6);
6469

-213 KB
Binary file not shown.

btree/test01

78.1 KB
Binary file not shown.

btree/test01.cpp

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ int main(void) {
121121
btree<long> testContainer(99);
122122
set<long> stableContainer;
123123

124-
insertRandomNumbers(testContainer, stableContainer, 100000);
124+
insertRandomNumbers(testContainer, stableContainer, 20);
125125
btree<long> btcpy = testContainer;
126126
confirmEverythingMatches(btcpy, stableContainer);
127127

@@ -143,65 +143,65 @@ int main(void) {
143143
cout << endl;
144144

145145

146-
// // a full-scale string test of the tree using iterators
147-
// btree<string> *strTable = new btree<string>(40);
146+
// a full-scale string test of the tree using iterators
147+
btree<string> *strTable = new btree<string>(40);
148148

149-
// ifstream wordFile("twl.txt");
150-
// if (!wordFile)
151-
// return 1; // file couldn't be opened for some reason, abort...
149+
ifstream wordFile("twl.txt");
150+
if (!wordFile)
151+
return 1; // file couldn't be opened for some reason, abort...
152152

153-
// while (wordFile.good()) {
154-
// string word;
155-
// getline(wordFile, word);
156-
// strTable->insert(word);
157-
// }
158-
// wordFile.close();
153+
while (wordFile.good()) {
154+
string word;
155+
getline(wordFile, word);
156+
strTable->insert(word);
157+
}
158+
wordFile.close();
159159

160-
// cout << "twl.txt sorted by our wonderful tree..." << endl;
161-
// // Such beautiful code with iterators...
162-
// // for(btree<string>::const_iterator iter = strTable->begin(); iter != strTable->end(); ++iter)
163-
// // cout << *iter << endl;
164-
// strTable->printAll();
160+
cout << "twl.txt sorted by our wonderful tree..." << endl;
161+
// Such beautiful code with iterators...
162+
// for(btree<string>::const_iterator iter = strTable->begin(); iter != strTable->end(); ++iter)
163+
// cout << *iter << endl;
164+
strTable->printAll();
165165

166-
// // reverse iterator
167-
// btree<string>::reverse_iterator riter = strTable->rbegin();
168-
// // btree<string>::const_iterator citer = strTable->begin();
166+
// reverse iterator
167+
btree<string>::reverse_iterator riter = strTable->rbegin();
168+
// btree<string>::const_iterator citer = strTable->begin();
169169

170-
// // std::cout << *riter << "fuck " << std::endl;
170+
// std::cout << *riter << "fuck " << std::endl;
171171

172-
// // if (*citer != *riter) {
173-
// // cout << "success!" << endl;
174-
// // }
172+
// if (*citer != *riter) {
173+
// cout << "success!" << endl;
174+
// }
175175

176176

177-
// for (; riter != strTable->rend(); ++riter) {
178-
// cout << *riter << endl;
179-
// }
177+
for (; riter != strTable->rend(); ++riter) {
178+
cout << *riter << endl;
179+
}
180180

181181

182182

183-
// // try to create a copy
184-
// btree<string> btcpy2;
183+
// try to create a copy
184+
btree<string> btcpy2;
185185

186-
// btcpy2 = *strTable;
186+
btcpy2 = *strTable;
187187

188-
// btcpy2.printAll();
188+
btcpy2.printAll();
189189

190-
// ofstream ofs1("out1");
191-
// ofstream ofs2("out2");
190+
ofstream ofs1("out1");
191+
ofstream ofs2("out2");
192192

193-
// copy(strTable->begin(), strTable->end(), ostream_iterator<string>(ofs1, " "));
194-
// ofs1 << endl;
195-
// ofs1 << *strTable << endl;
193+
copy(strTable->begin(), strTable->end(), ostream_iterator<string>(ofs1, " "));
194+
ofs1 << endl;
195+
ofs1 << *strTable << endl;
196196

197-
// delete strTable;
197+
delete strTable;
198198

199-
// copy(btcpy2.begin(), btcpy2.end(), ostream_iterator<string>(ofs2, " "));
200-
// ofs2 << endl;
201-
// ofs2 << btcpy2 << endl;
199+
copy(btcpy2.begin(), btcpy2.end(), ostream_iterator<string>(ofs2, " "));
200+
ofs2 << endl;
201+
ofs2 << btcpy2 << endl;
202202

203-
// ofs1.close();
204-
// ofs2.close();
203+
ofs1.close();
204+
ofs2.close();
205205

206206

207207

0 commit comments

Comments
 (0)