分治策略:从归并排序到最近点对问题

版权申诉
0 下载量 106 浏览量 更新于2024-07-08 收藏 8.95MB PDF 举报
"这篇文档是关于分治算法(Divide and Conquer)的讲座幻灯片,由Kevin Wayne创建并更新于2005年。主要内容涵盖了归并排序(Mergesort)、逆序对计数(Counting Inversions)、随机化快速排序(Randomized Quicksort)、中位数选择(Median Selection)以及最近点对问题(Closest Pair of Points)等。这些是分治算法的经典应用实例,旨在讲解如何通过分解问题、递归解决子问题,然后将结果合并来达到高效解题的目的。" 分治算法是一种重要的计算机科学中的算法设计策略,其基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这种策略通常能够将时间复杂度从原始的线性平方级别降低到对数级别的效率。 1. **归并排序(Mergesort)**:归并排序是一种典型的分治算法,它将一个数组分为两半,分别对两部分进行排序,然后将两个已排序的子数组合并为一个有序数组。归并排序的时间复杂度为O(n log n),空间复杂度为O(n)。 2. **逆序对计数(Counting Inversions)**:在排序数组中,如果一个元素出现在另一个元素之前,但其值较大,就形成了一个逆序对。计算逆序对的数量可以帮助评估数组的排序程度。逆序对问题也可以使用分治策略解决,时间复杂度可以达到O(n log n)。 3. **随机化快速排序(Randomized Quicksort)**:快速排序是另一种高效的排序算法,通常使用“分区”操作将数组分为两部分,一部分的所有元素都小于另一部分。随机化版本的快速排序在最坏情况下也能保持O(n log n)的时间复杂度。 4. **中位数选择(Median Selection)**:在未排序的数组中找到中间值(中位数)。分治方法可以用于选择第k小(或大)的元素,包括中位数。中位数问题的解决方案如“快速选择”算法,其平均时间复杂度为O(n)。 5. **最近点对问题(Closest Pair of Points)**:在二维平面上找到距离最近的两个点。经典的分治算法,如“平面分割”方法,可以在O(n log n)时间内解决此问题。 这些内容在计算机科学教育中占有重要地位,特别是对于算法设计和分析课程,因为它们展示了如何通过分治策略解决复杂问题,并且是理解和实现高级数据结构与算法的基础。通过学习和掌握这些算法,开发者能够编写更高效、更优化的代码,从而在实际应用中提高程序性能。

新数据前面多了一列无用的,每列用逗号隔开,改代码data = pd.read_csv('/home/w123/Documents/data-analysis/40-0-data/ratio/40-0-ratio.txt') y = data.iloc[:, :-1].values.reshape(-1, 1) X = data.iloc[:, -1].values.reshape(-1, 1) regressor = LinearRegression() regressor.fit(X, y) y_pred = regressor.predict(X) print("Regression Function: y = {:.2f} + {:.2f}x".format(regressor.intercept_[0], regressor.coef_[0][0])) plt.scatter(X, y, color='blue') plt.plot(X, y_pred, color='red') data2 = pd.read_csv('/home/w123/Documents/data-analysis/40-0-data/ratio/40-5-ratio.txt') y2 = data2.iloc[:, :-1].values.reshape(-1, 1) X2 = data2.iloc[:, -1].values.reshape(-1, 1) regressor2 = LinearRegression() regressor2.fit(X2, y2) y2_pred = regressor2.predict(X2) print("Regression Function: y = {:.2f} + {:.2f}x".format(regressor2.intercept_[0], regressor2.coef_[0][0])) plt.scatter(X2, y2, color='green') plt.plot(X2, y2_pred, color='orange') plt.legend(['Regression Line 2', 'Observations 2']) #3 data3 = pd.read_csv('/home/w123/Documents/data-analysis/40-0-data/ratio/40-10-ratio.txt') y3 = data3.iloc[:, :-1].values.reshape(-1, 1) X3 = data3.iloc[:, -1].values.reshape(-1, 1) regressor3 = LinearRegression() regressor3.fit(X3, y3) y3_pred = regressor3.predict(X3) print("Regression Function: y = {:.2f} + {:.2f}x".format(regressor3.intercept_[0], regressor.coef_[0][0])) plt.scatter(X3, y3, color='purple') plt.plot(X3, y3_pred, color='yellow') plt.title('Linear Regression') plt.xlabel('Independent Variable') plt.ylabel('Dependent Variable') plt.legend(['Regression Line 1', 'Observations 1', 'Regression Line 2', 'Observations 2', 'Regression Line 3', 'Observations 3']) plt.show()

2023-06-03 上传