stock_test.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import smtplib
  2. from email.mime.text import MIMEText
  3. from email.header import Header
  4. """
  5. 回溯算法(试探法)
  6. 在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
  7. 回溯算法解决问题的
  8. 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
  9. 确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
  10. 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
  11. """
  12. class StockTest(object):
  13. """
  14. 栈练习
  15. """
  16. def queen(self, A, cur=0):
  17. """
  18. 八皇后问题
  19. :param A:
  20. :param cur:
  21. :return:
  22. """
  23. if cur == len(A):
  24. print(A)
  25. # return 0
  26. else:
  27. for col in range(len(A)):
  28. A[cur], flag = col, True
  29. # 判断当前与之前的所有是否规则冲突
  30. for row in range(cur):
  31. if A[row] == col or abs(col - A[row]) == cur - row:
  32. flag = False
  33. break
  34. if flag:
  35. self.queen(A, cur + 1)
  36. def movingCount(self, threshold, rows, cols):
  37. "产生 0 矩阵 "
  38. board = [[0 for i in range(cols)] for j in range(rows)]
  39. global acc
  40. acc = 0
  41. "下标之和,若大于threshold则TRUE,否则Folse"
  42. def block(r, c):
  43. s = sum(map(int, str(r) + str(c)))
  44. return s > threshold
  45. def traverse(r, c):
  46. global acc
  47. if not (0 <= r < rows and 0 <= c < cols): # 超出角标范围挑出
  48. return
  49. if board[r][c] != 0: # 不等于0 跳出
  50. return
  51. if board[r][c] == -1 or block(r, c):
  52. board[r][c] = -1 # 超出门限的点记录-1
  53. return
  54. board[r][c] = 1 # 符合规定的点记录1,并计数加一
  55. acc += 1
  56. traverse(r + 1, c)
  57. traverse(r - 1, c)
  58. traverse(r, c + 1)
  59. traverse(r, c - 1)
  60. traverse(0, 0)
  61. return acc
  62. def bubble_sort(self, numbers):
  63. """
  64. 时间复杂度:O(n^2)
  65. :param numbers:
  66. :return:
  67. """
  68. n = len(numbers)
  69. for i in range(n):
  70. for j in range(0, n - i - 1):
  71. if numbers[j] > numbers[j + 1]:
  72. numbers[j], numbers[j + 1] = numbers[j + 1], numbers[j]
  73. return numbers
  74. def choose_sort(self, numbers):
  75. """
  76. 选择排序,时间复杂度O(n^2)
  77. :param numbers:
  78. :return:
  79. """
  80. n = len(numbers)
  81. for i in range(n):
  82. min_index = i
  83. min_value = numbers[i]
  84. for j in range(i + 1, n):
  85. if min_value > numbers[j]:
  86. min_value = numbers[j]
  87. min_index = j
  88. if min_index != i:
  89. numbers[min_index] = numbers[i]
  90. numbers[i] = min_value
  91. return numbers
  92. def insert_sort(self, numbers):
  93. """
  94. 插入排序,时间复杂度O(n^2)
  95. :return:
  96. """
  97. n = len(numbers)
  98. for i in range(1, n):
  99. insert_index = i - 1
  100. insert_value = numbers[i]
  101. while insert_index >= 0 and insert_value < numbers[insert_index]:
  102. numbers[insert_index + 1] = numbers[insert_index]
  103. insert_index -= 1
  104. if insert_index + 1 != i:
  105. numbers[insert_index + 1] = insert_value
  106. return numbers
  107. def shell_sort(self, numbers):
  108. """
  109. 希尔排序,时间复杂度O(n^2)
  110. :param numbers:
  111. :return:
  112. """
  113. n = len(numbers)
  114. gap = int(n / 2)
  115. while gap > 0:
  116. for i in range(gap, n):
  117. temp = numbers[i]
  118. j = i
  119. while j >= gap and numbers[j - gap] > temp:
  120. numbers[j] = numbers[j - gap]
  121. j -= gap
  122. numbers[i] = temp
  123. gap = int(gap / 2)
  124. return numbers
  125. def quick_sort(self, numbers):
  126. """
  127. 快速排序,时间复杂度O(n^2)
  128. :param numbers:
  129. :return:
  130. """
  131. if len(numbers) <= 1:
  132. return numbers
  133. pivot = numbers[int(len(numbers) / 2)]
  134. left = [x for x in numbers if x < pivot]
  135. middle = [pivot]
  136. right = [x for x in numbers if x > pivot]
  137. return self.quick_sort(left) + middle + self.quick_sort(right)
  138. def merge_sort(self, numbers):
  139. """
  140. 归并排序
  141. :param numbers:
  142. :return:
  143. """
  144. pass
  145. def radix_sort(self, numbers):
  146. """
  147. 基数排序,时间复杂度O(n*k)
  148. :param number:
  149. :return:
  150. """
  151. # 记录当前正在排拿一位,最低位为1
  152. i = 0
  153. max_num = max(numbers)
  154. # 记录最大值的位数
  155. j = len(str(max_num))
  156. while i < j:
  157. # 初始化桶数组
  158. bucket_list = [[] for _ in range(10)]
  159. for x in numbers:
  160. # 找到位置放入桶数组
  161. bucket_list[int(x / (10 ** i)) % 10].append(x)
  162. numbers.clear()
  163. # 放回原序列
  164. for x in bucket_list:
  165. numbers.extend([a for a in x])
  166. i += 1
  167. return numbers
  168. def send_mail(self):
  169. sender = '1285211525@qq.com'
  170. receivers = '1285211525@qq.com'
  171. message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
  172. message['From'] = Header('binren')
  173. message['To'] = Header('zhangbr')
  174. subject = 'test mail'
  175. message['Subject'] = Header(subject, 'utf-8')
  176. try:
  177. stmp_obj = smtplib.SMTP('localhost')
  178. stmp_obj.sendmail(sender, receivers, message.as_string())
  179. print('send successful')
  180. except Exception as e:
  181. print(e)
  182. if __name__ == '__main__':
  183. st = StockTest()
  184. nums = [1, 2, 5, 3, 1, 101, 10, 1111, 2]
  185. print(st.send_mail())