数据结构的基本实现

1. python中内置计算算法效率的类

class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=)
Timer是测量小段代码执行速度的类。

stmt参数是要测试的代码语句(statment);

setup参数是运行代码时需要的设置;

timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)

def test1():
   l = []
   for i in range(1000):
      l = l + [i]
def test2():
   l = []
   for i in range(1000):
      l.append(i)
def test3():
   l = [i for i in range(1000)]
def test4():
   l = list(range(1000))

from timeit import Timer

t1 = Timer("test1()", "from __main__ import test1")
print("concat ",t1.timeit(number=1000), "seconds")
t2 = Timer("test2()", "from __main__ import test2")
print("append ",t2.timeit(number=1000), "seconds")
t3 = Timer("test3()", "from __main__ import test3")
print("comprehension ",t3.timeit(number=1000), "seconds")
t4 = Timer("test4()", "from __main__ import test4")
print("list range ",t4.timeit(number=1000), "seconds")

# ('concat ', 1.7890608310699463, 'seconds')
# ('append ', 0.13796091079711914, 'seconds')
# ('comprehension ', 0.05671119689941406, 'seconds')
# ('list range ', 0.014147043228149414, 'seconds')

2.单链表的python实现

class SingleNode(object):
    """单链表的结点"""
    def __init__(self,item):
        # _item存放数据元素
        self.item = item
        # _next是下一个节点的标识
        self.next = None
# is_empty() 链表是否为空
# length() 链表长度
# travel() 遍历整个链表
# add(item) 链表头部添加元素
# append(item) 链表尾部添加元素
# insert(pos, item) 指定位置添加元素
# remove(item) 删除节点
# search(item) 查找节点是否存在
class SingleLinkList(object):
    """单链表"""
    def __init__(self):
        self._head = None

    def is_empty(self):
        if self._head:
            return True
        else:
            return False
    def travel(self):
        cur = self._head
        count = 1
        while cur != None:
            print(count ,"     ", cur.item)
            count += 1
            cur = cur.next

    def length(self):
        cur = self._head
        count = 1
        while cur != None:
            count += 1
            cur = cur.next
        return count


   # add(item) 链表头部添加元素
    def add(self, item):
        node = SingleNode(item)
        node.next = self._head
        self._head = node 



    # append(item) 链表尾部添加元素
    def append(self, item):
        node = SingleNode(item)
        if self._head == None:
            self._head = node
        cur = self._head
        while cur.next != None:
            cur = cur.next
        cur.next = node

    #insert(pos, item) 指定位置添加元素
    def insert(self, pos, item):
        node = SingleNode(item)
        len = self.length()
        cur =  self._head
        count = 1

        if pos <= 0 or pos > len:
            print('Please input position from',1, "to", len)
        while count < (pos-1):
            count += 1
            cur = cur.next
        node.next = cur.next
        cur.next = node

    #remove(item) 删除节点
    def remove(self, item):
        #先移除头结点
        if self._head.item == item:
            self._head = self._head.next
        cur =  self._head
        #移除除头结点以外的结点
        while cur.next != None:
            if cur.next.item == item:
                cur.next = cur.next.next
                break
            cur = cur.next




    def search(self, item):
        cur =  self._head
        count = 1
        while cur != None:
            if cur.item == item:
                return True
            count += 1
        return False
        




if __name__ == "__main__":
    s = SingleLinkList()
    for i in range(5):
        s.add(i)
    s.append(10)
    # s.insert(3, 90)
    print(s.search(4))
    s.remove(4)
    s.remove(0)
    s.travel()

    print(s.is_empty())

3.栈的python实现

# Stack() 创建一个新的空栈
# push(item) 添加一个新的元素item到栈顶
# pop() 弹出栈顶元素
# peek() 返回栈顶元素
# is_empty() 判断栈是否为空
# size() 返回栈的元素个数
class Stack(object):
    """栈"""
    def __init__(self):
         self.items = []

    def is_empty(self):
    	return self.items == []

    # push(item) 添加一个新的元素item到栈顶
    def push(self, item):
    	self.items.append(item)

    def pop(self):
    	self.items.pop()


    def size(self):
    	return len(self.items)

    def travel(self):
    	for item in self.items:
    		print(item)

    def peek(self):
    	length = self.size()
    	return self.items[length - 1]

if __name__ == '__main__':
	s = Stack()
	for i in range(1, 10):
		s.push(i)
	s.pop()
	print('peek', s.peek())

	s.travel()

4.队列

# Queue() 创建一个空的队列
# enqueue(item) 往队列中添加一个item元素
# dequeue() 从队列头部删除一个元素
# is_empty() 判断一个队列是否为空
# size() 返回队列的大小
class Queue(object):
	"""队列尾部进去,头部出来"""
	def __init__(self):
		self.items = []

# enqueue(item) 往队列中添加一个item元素
	def enqueue(self, item):
		length = self.size()
		self.items.insert(length, item)

	def size(self):
		return len(self.items)

# dequeue() 从队列头部删除一个元素
	def dequeue(self):
		length = self.size()
		self.items.pop(0)

	def is_empty(self):
		return self.items == []

	def travel(self):
		for item in self.items:
			print(item)

if __name__ == '__main__':
	q = Queue()
	for i in range(5):
		q.enqueue(i)
	q.dequeue()
	q.travel()

5.几种常见的排序实现

def selection_sort(list):
	length = len(list)
	for i in range(length):
		max_num = list[0]
		pos = 0
		for j in range(length-i):
			if max_num < list[j]:
				max_num = list[j]
				pos = j
		temp = list[pos]
		list[pos] = list[length-i-1]
		list[length-i-1] = temp
		# print(i, "   ", temp)
	return list

def insert_sort(list):
	length =len(list)
	for i in range(length):
		for j in range(i, 0, -1):
			if list[j] < list[j-1]:
				temp = list[j]
				list[j] = list[j-1]
				list[j-1] = temp
			
	return list
	#递归
def quick_sort(alist, start, end):
	if start >= end:
		return
	middle_num = alist[start]
	high = end
	low = start
	while low < high:
		#指针前移
	 	while low < high and alist[high] >= middle_num:
	 		high = high - 1
	 	alist[low] = alist[high]
		#指针后移
	 	while low < high and alist[low] <= middle_num:
	 		low = low-1
	 	alist[high] = alist[low]
	alist[low] = middle_num
	#递归
	quick_sort(alist, start, low-1)
	quick_sort(alist, low+1, end)

	return alist

	#希尔排序
def shell_sort(alist):
	pass

#归并排序
def merge_sort(alist):
	if len(alist) <= 1:
		return alist

	num = int(len(alist)/2)

	#将子序列都算出,然后归并
	left = merge_sort(alist[num:])
	right = merge_sort(alist[:num])
	# print("left", left, "right", right)
	return merge(left, right)

#归并
def merge(left, right):
	left_index = 0
	right_index = 0

	result = []

	while left_index < len(left) and right_index < len(right) :

		if left_index < len(left) and left[left_index] > right[right_index]:
			result.append(right[right_index])
			right_index += 1

		if right_index < len(right)  and left[left_index] <= right[right_index]:
			result.append(left[left_index])
			left_index += 1

	result += right[right_index:]
	result += left[left_index:]
	return result



if __name__ == '__main__':
	L = [3, 5, 14, 1, 89, 2]
	print("selection_sort", selection_sort(L))
	print("insert_sort", insert_sort(L))
	print("quick_sort", quick_sort(L, 0 ,len(L)-1))
	print("merge_sort", merge_sort(L))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内含资源如下: 1.基本数据结构 1.1.Array ........... 动态数组 1.2.LinkedList ... 链表 1.3.BST .............. 二分搜索树 1.4.MapBST ..... 二分搜索树(用于实现映射) 1.5.AVLTree ...... AVL树 2.接口 2.1.Queue ........... 队列接口 2.2.Stack .............. 栈接口 2.3.Set .................. 集合接口 2.4.Map ............... 映射接口 2.5.Merger .......... 自定义函数接口 2.6.UnionFind ..... 并查集接口 3.高级数据结构 3.1.ArrayQueue .......................... 队列_基于动态数组实现 3.2.LinkedListQueue .................. 队列__基于链表实现 3.3.LoopQueue ........................... 循环队列_基于动态数组实现 3.4.PriorityQueue ....................... 优先队列_基于最大二叉堆实现 3.5.ArrayPriorityQueue ............. 优先队列_基于动态数组实现 3.6.LinkedListPriorityQueue ..... 优先队列_基于链表实现 3.7.ArrayStack ............................. 栈_基于动态数组实现 3.8.LinkedListStack ..................... 栈_基于链表实现 3.9.BSTSet ..................................... 集合_基于二分搜索树实现 3.10.LinkedListSet ....................... 集合_基于链表实现 3.11.BSTMap ................................ 映射_基于二分搜索树实现 3.12.AVLTreeMap ....................... 映射_ 基于AVL树实现 3.13.LinkedListMap .................... 映射_基于链表实现 3.14.MaxHeap ............................. 最大二叉堆 3.15.SegmentTree ...................... 线段树 3.16.Trie ......................................... 字典树 3.17.QuickFind ............................ 并查集_基于数组实现 3.18.QuickUnion ......................... 并查集_基于树思想实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值