Skip to content

Commit c0fdee9

Browse files
authored
Added order statistics to BST (#31)
* added ArrayForTrees * added order statistics to BSTs * removed tuple as input from arrays
1 parent fbc4a25 commit c0fdee9

File tree

5 files changed

+322
-91
lines changed

5 files changed

+322
-91
lines changed

pydatastructs/linear_data_structures/arrays.py

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class OneDimensionalArray(Array):
2323
A valid object type.
2424
size: int
2525
The number of elements in the array.
26-
elements: list/tuple
26+
elements: list
2727
The elements in the array, all should
2828
be of same type.
2929
init: a python type
@@ -73,12 +73,18 @@ def __new__(cls, dtype=NoneType, *args, **kwargs):
7373
obj = object.__new__(cls)
7474
obj._dtype = dtype
7575
if len(args) == 2:
76-
if _check_type(args[0], (list, tuple)) and \
76+
if _check_type(args[0], list) and \
7777
_check_type(args[1], int):
78-
size, data = args[1], [dtype(arg) for arg in args[0]]
79-
elif _check_type(args[1], (list, tuple)) and \
78+
for i in range(len(args[0])):
79+
if dtype != type(args[0][i]):
80+
args[0][i] = dtype(args[0][i])
81+
size, data = args[1], [arg for arg in args[0]]
82+
elif _check_type(args[1], list) and \
8083
_check_type(args[0], int):
81-
size, data = args[0], [dtype(arg) for arg in args[1]]
84+
for i in range(len(args[1])):
85+
if dtype != type(args[1][i]):
86+
args[1][i] = dtype(args[1][i])
87+
size, data = args[0], [arg for arg in args[1]]
8288
else:
8389
raise TypeError("Expected type of size is int and "
8490
"expected type of data is list/tuple.")
@@ -93,8 +99,11 @@ def __new__(cls, dtype=NoneType, *args, **kwargs):
9399
init = kwargs.get('init', None)
94100
obj._data = [init for i in range(args[0])]
95101
elif _check_type(args[0], (list, tuple)):
102+
for i in range(len(args[0])):
103+
if dtype != type(args[0][i]):
104+
args[0][i] = dtype(args[0][i])
96105
obj._size, obj._data = len(args[0]), \
97-
[dtype(arg) for arg in args[0]]
106+
[arg for arg in args[0]]
98107
else:
99108
raise TypeError("Expected type of size is int and "
100109
"expected type of data is list/tuple.")
@@ -110,7 +119,9 @@ def __setitem__(self, idx, elem):
110119
if elem is None:
111120
self._data[idx] = None
112121
else:
113-
self._data[idx] = self._dtype(elem)
122+
if type(elem) != self._dtype:
123+
elem = self._dtype(elem)
124+
self._data[idx] = elem
114125

115126
def fill(self, elem):
116127
elem = self._dtype(elem)
@@ -237,8 +248,40 @@ def delete(self, idx):
237248
self[idx] != None:
238249
self[idx] = None
239250
self._num -= 1
240-
self._modify()
251+
return self._modify()
241252

242253
@property
243254
def size(self):
244255
return self._size
256+
257+
class ArrayForTrees(DynamicOneDimensionalArray):
258+
"""
259+
Utility dynamic array for storing nodes of a tree.
260+
261+
See Also
262+
========
263+
264+
pydatastructs.linear_data_structures.arrays.DynamicOneDimensionalArray
265+
"""
266+
def _modify(self):
267+
if self._num/self._size < self._load_factor:
268+
new_indices = dict()
269+
arr_new = OneDimensionalArray(self._dtype, 2*self._num + 1)
270+
j = 0
271+
for i in range(self._last_pos_filled + 1):
272+
if self[i] != None:
273+
arr_new[j] = self[i]
274+
new_indices[self[i].key] = j
275+
j += 1
276+
for i in range(j):
277+
if arr_new[i].left != None:
278+
arr_new[i].left = new_indices[self[arr_new[i].left].key]
279+
if arr_new[i].right != None:
280+
arr_new[i].right = new_indices[self[arr_new[i].right].key]
281+
if arr_new[i].parent != None:
282+
arr_new[i].parent = new_indices[self[arr_new[i].parent].key]
283+
self._last_pos_filled = j - 1
284+
self._data = arr_new._data
285+
self._size = arr_new._size
286+
return new_indices
287+
return None

pydatastructs/linear_data_structures/tests/test_arrays.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
def test_OneDimensionalArray():
77
ODA = OneDimensionalArray
8-
A = ODA(int, 5, [1, 2, 3, 4, 5], init=6)
8+
A = ODA(int, 5, [1.0, 2, 3, 4, 5], init=6)
9+
A[1] = 2.0
910
assert A
10-
assert ODA(int, (1, 2, 3, 4, 5), 5)
11+
assert ODA(int, [1.0, 2, 3, 4, 5], 5)
1112
assert ODA(int, 5)
12-
assert ODA(int, [1, 2, 3])
13+
assert ODA(int, [1.0, 2, 3])
1314
raises(IndexError, lambda: A[7])
1415
raises(IndexError, lambda: A[-1])
1516
raises(ValueError, lambda: ODA())

0 commit comments

Comments
 (0)