数据结构——数组

实现一个支持动态扩容的数组


 

class DynamicArray:

    def __init__(self):
        self._n = 0
        self._capacity = 10
        self._A = self._make_array(self._capacity)

    def __len__(self):
        return self._n

    def is_empty(self):
        return self._n == 0

    # O(1)
    def __getitem__(self, k):
        if not 0 <= k < self._n:
            raise ValueError('invalid index')
        return self._A[k]

    # O(1)
    def append(self, obj):
        if self._n == self._capacity:  # 首先要判断该容器是否放得下
            self._resize(2 * self._capacity)
        self._A[self._n] = obj
        self._n += 1

    def _make_array(self, c):
        return c * [None]

    def _resize(self, c):
        B = self._make_array(c)
        for k in range(self._n):
            B[k] = self._A[k]
        self._A = B
        self._capacity = c

        # O(n)

    def insert(self, k, value):
        if self._n == self._capacity:
            self._resize(2 * self._capacity)
        for j in range(self._n, k, -1):  # 从后往前一个一个往后移
            self._A[j] = self._A[j - 1]
        self._A[k] = value
        self._n += 1

    # O(n)
    def remove(self, value):
        for k in range(self._n):
            if self._A[k] == value:  # 一个个查value
                for j in range(k, self._n - 1):
                    self._A[j] = self._A[j + 1]   # 再一个个移上来
                self._A[self._n - 1] = None
                self._n -= 1
                return
        raise ValueError('value not found')

    def _print(self):
        for i in range(self._n):
            print(self._A[i], end=' ')
        print()


if __name__ == '__main__':
    mylist = DynamicArray()
    print('size was: ', str(len(mylist)))
    mylist.append(10)
    mylist.append(20)
    mylist.append(30)
    mylist.insert(0, 0)
    mylist.insert(1, 5)
    mylist.insert(3, 15)
    mylist._print()
    mylist.remove(20)
    mylist._print()
    print('size is: ', str(len(mylist)))

实现一个大小固定的有序数组,支持动态增删改操作


 

class DynamicArray:

    def __init__(self):
        self._n = 0
        self._capacity = 10
        self._A = self._make_array(self._capacity)

    def __len__(self):
        return self._n

    def is_empty(self):
        return self._n == 0

    # O(1)
    def __getitem__(self, k):
        if not 0 <= k < self._n:
            raise ValueError('invalid index')
        return self._A[k]

    # O(1)
    def append(self, obj):
        if self._n == self._capacity:  # 首先要判断该容器是否放得下
            self._resize(2 * self._capacity)
        self._A[self._n] = obj
        self._n += 1

    def _make_array(self, c):
        return c * [None]

    def _resize(self, c):
        B = self._make_array(c)
        for k in range(self._n):
            B[k] = self._A[k]
        self._A = B
        self._capacity = c

        # O(n)

    def insert(self, k, value):
        if self._n == self._capacity:
            self._resize(2 * self._capacity)
        for j in range(self._n, k, -1):  # 从后往前一个一个往后移
            self._A[j] = self._A[j - 1]
        self._A[k] = value
        self._n += 1

    # O(n)
    def remove(self, value):
        for k in range(self._n):
            if self._A[k] == value:  # 一个个查value
                for j in range(k, self._n - 1):
                    self._A[j] = self._A[j + 1]   # 再一个个移上来
                self._A[self._n - 1] = None
                self._n -= 1
                return
        raise ValueError('value not found')

    def _print(self):
        for i in range(self._n):
            print(self._A[i], end=' ')
        print()


if __name__ == '__main__':
    mylist = DynamicArray()
    print('size was: ', str(len(mylist)))
    mylist.append(10)
    mylist.append(20)
    mylist.append(30)
    mylist.insert(0, 0)
    mylist.insert(1, 5)
    mylist.insert(3, 15)
    mylist._print()
    mylist.remove(20)
    mylist._print()
    print('size is: ', str(len(mylist)))

实现两个有序数组合并为一个有序数组


def merge(list1, list2):
    res = []
    while len(list1) > 0 and len(list2) > 0:
        res.append(list1.pop(0) if list1[0] < list2[0] else list2.pop(0))

    res.extend(list1)
    res.extend(list2)
    return res


if __name__ == '__main__':
    list1 = [1, 4, 8, 9, 21, 42]
    list2 = [3, 9, 15, 16, 19, 36, 39, 84, 91, 127]
    print(merge(list1, list2))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值