Timsort:最快排序算法

Timsort(泰姆排序)是一种混合排序算法,结合了合并排序(Merge Sort)和插入排序(Insertion Sort)的特性。它由Tim Peters在2002年为Python的排序算法而设计,并在Python 2.3版本中首次实现。

Tim Sort 是Python 的sorted()和list.sort()函数使用的默认排序算法。

自从该算法被发明以来,它已被用作Python、Java、Android平台和GNU Octave中的默认排序算法。Java中使用Java的标准库(java.util.Arrays类)来使用Timsort。

import java.util.Arrays;

public class TimsortExample {
public static void main(String[] args) {
// 示例数据
int[] array = {5, 2, 9, 1, 5, 6};

// 使用Arrays.sort()方法,底层使用Timsort
Arrays.sort(array);

// 打印排序后的结果
System.out.println("Sorted Array: " + Arrays.toString(array));
}
}

这个简单的示例演示了如何使用Java的Arrays.sort()方法对一个整数数组进行排序。在实际应用中,你可以用类似的方式对其他类型的数组或对象数组进行排序。

请注意,Java的Arrays.sort()方法使用了Timsort的实现,因此你不需要自己实现Timsort算法,除非你有特殊的需求

Timsort:一种非常快速、O(n log n)、稳定的排序算法,专为现实世界构建,而不是在学术界构建。

Timsort的设计目的是克服其他排序算法在特定情况下的性能缺陷。它在实际应用中表现良好,尤其在处理有序数据或包含小规模子数组的数据时效果显著。

Timsort的主要思想是利用现实世界数据的一些特性,例如数据通常部分有序。它采用分而治之的策略,首先将数据分割成小的块,然后对这些块进行排序,最后再将这些有序块合并起来。该算法具有线性对数时间复杂度(O(n log n)),并且在最坏情况下的性能也比较好。

蒂姆排序算法
Tim Sort 背后的主要思想是利用数据中现有的顺序来最大限度地减少比较和交换的次数。它通过将数组划分为已排序的称为运行的小子数组,然后使用修改后的合并排序算法合并这些运行来实现此目的。

以下面的数组为例:arr[] = {4, 2, 8, 6, 1, 5, 9, 3, 7}。

  • 步骤 1:定义运行的大小

最小运行规模:32(由于我们的数组较小,因此忽略这一步)

  • 步骤 2:将阵列划分为运行

在这一步中,我们将使用插入排序对数组中的小子序列(运行)进行排序。
初始数组[4, 2, 8, 6, 1, 5, 9, 3, 7]
没有初始运行,因此我们将使用插入排序创建运行。
排序后的运行[2, 4], [6, 8], [1, 5, 9], [3, 7]
更新数组:[2, 4, 6, 8, 1, 5, 9, 3, 7]

  • 步骤 3:合并运行

在这一步中,我们将使用修改后的合并排序算法合并已排序的运行。
合并运行,直到整个数组排序完毕。
合并运行[2, 4, 6, 8], [1, 3, 5, 7, 9]
更新后的数组:[2, 4, 6, 8, 1, 3, 5, 7, 9]

  • 步骤 4:调整运行规模

每次合并操作后,我们都会将运行的大小加倍,直到超过数组的长度。
运行大小加倍:32、64、128(因为我们的数组很小,所以忽略这一步)

  • 第 5 步:继续合并

重复合并过程,直到整个数组排序完毕。
最终合并的运行结果[1, 2, 3, 4, 5, 6, 7, 8, 9]
最终排序后的数组为 [1,2,3,4,5,6,7,8,9]。

下面是 TimSort 的实现:

// C++ program to perform TimSort. 
include <bits/stdc++.h> 
using namespace std; 
const int RUN = 32; 

// 该函数对数组进行排序,从左索引
// 索引排序到右索引,右索引是
// 最大的 RUN
void insertionSort(int arr[], int left, int right) 

for (int i = left + 1; i <= right; i++) { 
int temp = arr[i]; 
int j = i - 1; 
while (j >= left && arr[j] > temp) { 
arr[j + 1] = arr[j]; 
j--; 

arr[j + 1] = temp; 

// 合并函数合并已排序的运行结果
void merge(int arr[], int l, int m, int r) 

    // 原始数组被分成两部分
// 左右两部分
int len1 = m - l + 1, len2 = r - m; 
int left[len1], right[len2]; 
for (int i = 0; i < len1; i++) 
left[i] = arr[l + i]; 
for (int i = 0; i < len2; i++) 
right[i] = arr[m + 1 + i]; 

    int i = 0; 
int j = 0; 
int k = l; 

    // 比较之后,我们
// 合并这两个数组
// 合并为更大的子数组
while (i < len1 && j < len2) { 
if (left[i] <= right[j]) { 
arr[k] = left[i]; 
i++; 

else { 
arr[k] = right[j]; 
j++; 

k++; 

    // 复制
// 如果有的话
while (i < len1) { 
arr[k] = left[i]; 
k++; 
i++; 

    // Copy remaining element of 
// right, if any 
while (j < len2) { 
arr[k] = right[j]; 
k++; 
j++; 

//迭代 Timsort 函数,用于对
// 数组[0...n-1]排序(类似于合并排序)
void timSort(int arr[], int n) 

    // 对大小为 RUN 的单个子数组进行排序
for (int i = 0; i < n; i += RUN) 
insertionSort(arr, i, min((i + RUN - 1), (n - 1))); 

    // 从 RUN(或 32)开始合并。
// 它将合并
// 形成大小为 64,然后是 128、256
// 以此类推 ....
for (int size = RUN; size < n; size = 2 * size) { 

        // 选择
// 左侧子数组的起点。我们
// 合并
// arr[left...left+size-1] 和 arr[left+size, left+2*size-1] 合并。
// 和 arr[left+size, left+2*size-1] 进行合并。
// 每次合并后,我们
// 将 left 增加 2*size
for (int left = 0; left < n; left += 2 * size) { 

            //查找
// 左侧子数组
// mid+1 是右子数组的起点
//右子数组的起点
int mid = left + size - 1; 
int right = min((left + 2 * size - 1), (n - 1)); 

            //合并子数组 arr[left.....mid] &
// arr[mid+1....right]
if (mid < right) 
merge(arr, left, mid, right); 


// Utility function to print the Array 
void printArray(int arr[], int n) 

for (int i = 0; i < n; i++) 
printf("%d ", arr[i]); 
printf("\n"); 

// Driver program to test above function 
int main() 

int arr[] = { -2, 7, 15, -14, 0, 15, 0, 7, 
-7, -4, -13, 5, 8, -14, 12 }; 
int n = sizeof(arr) / sizeof(arr[0]); 
printf("Given Array is\n"); 
printArray(arr, n); 

    // Function Call 
timSort(arr, n); 

    printf("After Sorting Array is\n"); 
printArray(arr, n); 
return 0; 
}

Java程序:

// Java program to perform TimSort. 
class GFG { 

    static int MIN_MERGE = 32; 

    public static int minRunLength(int n) 

assert n >= 0; 

        // Becomes 1 if any 1 bits are shifted off 
int r = 0; 
while (n >= MIN_MERGE) { 
r |= (n & 1); 
n >>= 1; 

return n + r; 

    // This function sorts array from left index to 
// to right index which is of size atmost RUN 
public static void insertionSort(int[] arr, int left, 
int right) 

for (int i = left + 1; i <= right; i++) { 
int temp = arr[i]; 
int j = i - 1; 
while (j >= left && arr[j] > temp) { 
arr[j + 1] = arr[j]; 
j--; 

arr[j + 1] = temp; 

    // Merge function merges the sorted runs 
public static void merge(int[] arr, int l, int m, int r) 

// Original array is broken in two parts 
// left and right array 
int len1 = m - l + 1, len2 = r - m; 
int[] left = new int[len1]; 
int[] right = new int[len2]; 
for (int x = 0; x < len1; x++) { 
left[x] = arr[l + x]; 

for (int x = 0; x < len2; x++) { 
right[x] = arr[m + 1 + x]; 

        int i = 0; 
int j = 0; 
int k = l; 

        // After comparing, we merge those two array 
// in larger sub array 
while (i < len1 && j < len2) { 
if (left[i] <= right[j]) { 
arr[k] = left[i]; 
i++; 

else { 
arr[k] = right[j]; 
j++; 

k++; 

        // Copy remaining elements 
// of left, if any 
while (i < len1) { 
arr[k] = left[i]; 
k++; 
i++; 

        // Copy remaining element 
// of right, if any 
while (j < len2) { 
arr[k] = right[j]; 
k++; 
j++; 

    // Iterative Timsort function to sort the 
// array[0...n-1] (similar to merge sort) 
public static void timSort(int[] arr, int n) 

int minRun = minRunLength(MIN_MERGE); 

        // Sort individual subarrays of size RUN 
for (int i = 0; i < n; i += minRun) { 
insertionSort( 
arr, i, 
Math.min((i + MIN_MERGE - 1), (n - 1))); 

        // Start merging from size 
// RUN (or 32). It will 
// merge to form size 64, 
// then 128, 256 and so on 
// .... 
for (int size = minRun; size < n; size = 2 * size) { 

            // Pick starting point 
// of left sub array. We 
// are going to merge 
// arr[left..left+size-1] 
// and arr[left+size, left+2*size-1] 
// After every merge, we 
// increase left by 2*size 
for (int left = 0; left < n; left += 2 * size) { 

                // Find ending point of left sub array 
// mid+1 is starting point of right sub 
// array 
int mid = left + size - 1; 
int right = Math.min((left + 2 * size - 1), 
(n - 1)); 

                // Merge sub array arr[left.....mid] & 
// arr[mid+1....right] 
if (mid < right) 
merge(arr, left, mid, right); 


    // Utility function to print the Array 
public static void printArray(int[] arr, int n) 

for (int i = 0; i < n; i++) { 
System.out.print(arr[i] + " "); 

System.out.print("\n"); 

    // Driver code 
public static void main(String[] args) 

int[] arr = { -2, 7, 15, -14, 0, 15, 0, 7, 
-7, -4, -13, 5, 8, -14, 12 }; 
int n = arr.length; 
System.out.println("Given Array is"); 
printArray(arr, n); 

        timSort(arr, n); 

        System.out.println("After Sorting Array is"); 
printArray(arr, n); 

Python3

# Python3 program to perform basic timSort 
MIN_MERGE = 32

def calcMinRun(n): 
"""Returns the minimum length of a 
run from 23 - 64 so that 
the len(array)/minrun is less than or 
equal to a power of 2. 

    e.g. 1=>1, ..., 63=>63, 64=>32, 65=>33, 
..., 127=>64, 128=>32, ... 
"""
r = 0
while n >= MIN_MERGE: 
r |= n & 1
n >>= 1
return n + r 

# This function sorts array from left index to 
# to right index which is of size atmost RUN 
def insertionSort(arr, left, right): 
for i in range(left + 1, right + 1): 
j = i 
while j > left and arr[j] < arr[j - 1]: 
arr[j], arr[j - 1] = arr[j - 1], arr[j] 
j -= 1

# Merge function merges the sorted runs 
def merge(arr, l, m, r): 

    # original array is broken in two parts 
# left and right array 
len1, len2 = m - l + 1, r - m 
left, right = [], [] 
for i in range(0, len1): 
left.append(arr[l + i]) 
for i in range(0, len2): 
right.append(arr[m + 1 + i]) 

    i, j, k = 0, 0, l 

    # after comparing, we merge those two array 
# in larger sub array 
while i < len1 and j < len2: 
if left[i] <= right[j]: 
arr[k] = left[i] 
i += 1

        else: 
arr[k] = right[j] 
j += 1

        k += 1

    # Copy remaining elements of left, if any 
while i < len1: 
arr[k] = left[i] 
k += 1
i += 1

    # Copy remaining element of right, if any 
while j < len2: 
arr[k] = right[j] 
k += 1
j += 1

# Iterative Timsort function to sort the 
# array[0...n-1] (similar to merge sort) 
def timSort(arr): 
n = len(arr) 
minRun = calcMinRun(n) 

    # Sort individual subarrays of size RUN 
for start in range(0, n, minRun): 
end = min(start + minRun - 1, n - 1) 
insertionSort(arr, start, end) 

    # Start merging from size RUN (or 32). It will merge 
# to form size 64, then 128, 256 and so on .... 
size = minRun 
while size < n: 

        # Pick starting point of left sub array. We 
# are going to merge arr[left..left+size-1] 
# and arr[left+size, left+2*size-1] 
# After every merge, we increase left by 2*size 
for left in range(0, n, 2 * size): 

            # Find ending point of left sub array 
# mid+1 is starting point of right sub array 
mid = min(n - 1, left + size - 1) 
right = min((left + 2 * size - 1), (n - 1)) 

            # Merge sub array arr[left.....mid] & 
# arr[mid+1....right] 
if mid < right: 
merge(arr, left, mid, right) 

        size = 2 * size 

# Driver program to test above function 
if __name__ == "__main__": 

    arr = [-2, 7, 15, -14, 0, 15, 0, 
7, -7, -4, -13, 5, 8, -14, 12] 

    print("Given Array is") 
print(arr) 

    # Function Call 
timSort(arr) 

    print("After Sorting Array is") 
print(arr) 

Cinclude

// C# program to perform TimSort. 
using System; 

class GFG { 
public const int RUN = 32; 

    // This function sorts array from left index to 
// to right index which is of size atmost RUN 
public static void insertionSort(int[] arr, int left, 
int right) 

for (int i = left + 1; i <= right; i++) { 
int temp = arr[i]; 
int j = i - 1; 
while (j >= left && arr[j] > temp) { 
arr[j + 1] = arr[j]; 
j--; 

arr[j + 1] = temp; 

    // merge function merges the sorted runs 
public static void merge(int[] arr, int l, int m, int r) 

// original array is broken in two parts 
// left and right array 
int len1 = m - l + 1, len2 = r - m; 
int[] left = new int[len1]; 
int[] right = new int[len2]; 
for (int x = 0; x < len1; x++) 
left[x] = arr[l + x]; 
for (int x = 0; x < len2; x++) 
right[x] = arr[m + 1 + x]; 

        int i = 0; 
int j = 0; 
int k = l; 

        // After comparing, we merge those two array 
// in larger sub array 
while (i < len1 && j < len2) { 
if (left[i] <= right[j]) { 
arr[k] = left[i]; 
i++; 

else { 
arr[k] = right[j]; 
j++; 

k++; 

        // Copy remaining elements 
// of left, if any 
while (i < len1) { 
arr[k] = left[i]; 
k++; 
i++; 

        // Copy remaining element 
// of right, if any 
while (j < len2) { 
arr[k] = right[j]; 
k++; 
j++; 

    // Iterative Timsort function to sort the 
// array[0...n-1] (similar to merge sort) 
public static void timSort(int[] arr, int n) 

        // Sort individual subarrays of size RUN 
for (int i = 0; i < n; i += RUN) 
insertionSort(arr, i, 
Math.Min((i + RUN - 1), (n - 1))); 

        // Start merging from size RUN (or 32). 
// It will merge 
// to form size 64, then 
// 128, 256 and so on .... 
for (int size = RUN; size < n; size = 2 * size) { 

            // Pick starting point of 
// left sub array. We 
// are going to merge 
// arr[left..left+size-1] 
// and arr[left+size, left+2*size-1] 
// After every merge, we increase 
// left by 2*size 
for (int left = 0; left < n; left += 2 * size) { 

                // Find ending point of left sub array 
// mid+1 is starting point of 
// right sub array 
int mid = left + size - 1; 
int right = Math.Min((left + 2 * size - 1), 
(n - 1)); 

                // Merge sub array arr[left.....mid] & 
// arr[mid+1....right] 
if (mid < right) 
merge(arr, left, mid, right); 


    // Utility function to print the Array 
public static void printArray(int[] arr, int n) 

for (int i = 0; i < n; i++) 
Console.Write(arr[i] + " "); 
Console.Write("\n"); 

    // Driver program to test above function 
public static void Main() 

int[] arr = { -2, 7, 15, -14, 0, 15, 0, 7, 
-7, -4, -13, 5, 8, -14, 12 }; 
int n = arr.Length; 
Console.Write("Given Array is\n"); 
printArray(arr, n); 

        // Function Call 
timSort(arr, n); 

        Console.Write("After Sorting Array is\n"); 
printArray(arr, n); 

Javascript

<script>  // Javascript program to perform TimSort.  let MIN\_MERGE = 32;  function minRunLength(n)  {           // Becomes 1 if any 1 bits are shifted off      let r = 0;      while (n >= MIN\_MERGE)      {          r |= (n & 1);          n >>= 1;      }      return n + r;  }  // This function sorts array from left index to  // to right index which is of size atmost RUN  function insertionSort(arr,left,right)  {      for(let i = left + 1; i <= right; i++)      {          let temp = arr\[i\];          let j = i - 1;                   while (j >= left && arr\[j\] > temp)          {              arr\[j + 1\] = arr\[j\];              j--;          }          arr\[j + 1\] = temp;      }  }  // Merge function merges the sorted runs  function merge(arr, l, m, r)  {           // Original array is broken in two parts      // left and right array      let len1 = m - l + 1, len2 = r - m;      let left = new Array(len1);      let right = new Array(len2);      for(let x = 0; x < len1; x++)      {          left\[x\] = arr\[l + x\];      }      for(let x = 0; x < len2; x++)      {          right\[x\] = arr\[m + 1 + x\];      }      let i = 0;      let j = 0;      let k = l;      // After comparing, we merge those two      // array in larger sub array      while (i < len1 && j < len2)      {          if (left\[i\] <= right\[j\])          {              arr\[k\] = left\[i\];              i++;          }          else         {              arr\[k\] = right\[j\];              j++;          }          k++;      }      // Copy remaining elements      // of left, if any      while (i < len1)      {          arr\[k\] = left\[i\];          k++;          i++;      }      // Copy remaining element      // of right, if any      while (j < len2)      {          arr\[k\] = right\[j\];          k++;          j++;      }  }  // Iterative Timsort function to sort the  // array\[0...n-1\] (similar to merge sort)  function timSort(arr, n)  {      let minRun = minRunLength(MIN\_MERGE);               // Sort individual subarrays of size RUN      for(let i = 0; i < n; i += minRun)      {          insertionSort(arr, i, Math.min(              (i + MIN\_MERGE - 1), (n - 1)));      }      // Start merging from size      // RUN (or 32). It will      // merge to form size 64,      // then 128, 256 and so on      // ....      for(let size = minRun; size < n; size = 2 \* size)      {                   // Pick starting point          // of left sub array. We          // are going to merge          // arr\[left..left+size-1\]          // and arr\[left+size, left+2\*size-1\]          // After every merge, we          // increase left by 2\*size          for(let left = 0; left < n;                          left += 2 \* size)          {              // Find ending point of left sub array              // mid+1 is starting point of right sub              // array              let mid = left + size - 1;              let right = Math.min((left + 2 \* size - 1),                                      (n - 1));              // Merge sub array arr\[left.....mid\] &              // arr\[mid+1....right\]              if(mid < right)                  merge(arr, left, mid, right);          }      }  }  // Utility function to print the Array  function printArray(arr,n)  {      for(let i = 0; i < n; i++)      {          document.write(arr\[i\] + " ");      }      document.write("
");  }  // Driver code  let arr = \[ -2, 7, 15, -14, 0, 15, 0, 7,              -7, -4, -13, 5, 8, -14, 12 \];  let n = arr.length;  document.write("Given Array is
");  printArray(arr, n);  timSort(arr, n);  document.write("After Sorting Array is
");  printArray(arr, n);  </script>

Output
Given Array is
-2  7  15  -14  0  15  0  7  -7  -4  -13  5  8  -14  12  
After Sorting Array is
-14  -14  -13  -7  -4  -2  0  0  5  7  7  8  12  15  15

https://www.jdon.com/71611.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05.构造程序逻辑

构造程序逻辑 学完前面的几个章节后&#xff0c;我觉得有必要在这里带大家做一些练习来巩固之前所学的知识&#xff0c;虽然迄今为止我们学习的内容只是Python的冰山一角&#xff0c;但是这些内容已经足够我们来构建程序中的逻辑。对于编程语言的初学者来说&#xff0c;在学习…

Looper如何通过ThreadLocal保证的线程独有

ThreadLocalMap 每个线程Thread都会维护一个threadLocals变量&#xff1a;ThreadLocalMap。这个类是ThreadLocal的静态内部类。当进行ThreadLocal的set()和get()时都会去获取线程里面的这个threadLocals进行设值和取值操作。所以ThreadLocal可以做到各个线程间数据互不干扰 T…

python 写自动点击爬取数据

今天来点不一样的&#xff01;哥们 提示&#xff1a; 这里只是用于自己学习的 &#xff0c;请勿用违法地方 效果图 会进行点击下一页 进行抓取 需要其他操作也可以自己写 文章目录 今天来点不一样的&#xff01;哥们前言一、上代码&#xff1f;总结 前言 爬虫是指通过编程自动…

Spark基础原理

Spark On Yarn Spark On Yarn的本质 Spark专注于分布式计算,Yarn专注于资源管理,Spark将资源管理的工作交给了Yarn来负责 Spark On Yarn两种部署方式 Spark中有两种部署方式&#xff0c;Client和Cluster方式&#xff0c;默认是Client方式。这两种方式的本质区别&#xff0c…

[C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测

【官方框架地址】 https://github.com/ViewFaceCore/ViewFaceCore 【算法介绍】 SeetaFace6是由中国科技公司自主研发的一款人脸识别技术&#xff0c;它基于深度学习算法&#xff0c;能够快速、准确地识别出人脸&#xff0c;并且支持多种应用场景&#xff0c;如门禁系统、移动…

智慧校园电子班牌管理系统源码 Java Android原生

智慧校园电子班牌系统源码是一种智能化的教育管理解决方案&#xff0c;它可以在学校内实现信息共享、教学管理、学生管理、家校互通等各个方面的协调与配合&#xff0c;帮助教师、学生和家长更加高效地开展教学活动、管理学生、协同合作&#xff0c;从而推动学校教育水平的提高…

【设计模式之美】 SOLID 原则之四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?

文章目录 一. 如何理解“接口隔离原则”&#xff1f;二. 接口隔离的三个情况1. 把“接口”理解为一组 API 接口集合2. 把“接口”理解为单个 API 接口或函数 ing&#xff08;能够使用的场景并未理解&#xff09;3. 把“接口”理解为 OOP 中的接口概念 一. 如何理解“接口隔离原…

Redis内存策略:「过期Key删除策略」+ 「内存淘汰策略」

Redis之所以性能强&#xff0c;最主要的原因就是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;否则会影响持久化或主从同步的性能。 Redis内存满了&#xff0c;会发生什么&#xff1f; 在Redis的运行内存达到了某个阈值&#xff0c;就会触发内存…

图神经网络入门

图神经网络&#xff08;GNN&#xff09;是一组在图领域工作的深度学习方法。 这些网络最近已应用于多个领域&#xff0c;包括&#xff1a; 组合优化、推荐系统、计算机视觉—仅举几例。 这些网络还可用于对大型系统进行建模&#xff0c;例如社交网络、蛋白质-蛋白质相互作用网络…

Python 数据类型有哪些?

Python 数据类型 Python 数据类型用于定义变量的类型。它定义了我们将在变量中存储哪种类型的数据。存储在内存中的数据可以有很多种类型。例如&#xff0c;一个人的年龄被存储为数值&#xff0c;他或她的地址被存储为字母数字字符。 Python 有各种内置数据类型&#xff0c;主…

软件测试方法分类-按测试对象划分

接上一篇,下来我们再细讲,第四个维度的分类, 软件测试方法分类-按测试对象划分 本章节重点介绍非功能测试的相关知识,因为功能测试的基本在之前的分类都是有涉及的。 一、非功能测试 1,性能测试(Performance Testing) 检查系统是否满足需求规格说明书中规定的性能。 …

pytorch07:损失函数与优化器

目录 一、损失函数是什么二、常见的损失函数2.1 nn.CrossEntropyLoss交叉熵损失函数2.1.1 交叉熵的概念2.2.2 交叉熵代码实现2.2.3 加权重损失 2.2 nn.NLLLoss2.2.1 代码实现 2.3 nn.BCELoss2.3.1 代码实现 2.4 nn.BCEWithLogitsLoss2.4.1 代码实现 三、优化器Optimizer3.1 什么…

android常用方法

获取应用安装来源 private String getAppInstaller(Context context, String packageName) {return context.getPackageManager().getInstallerPackageName(packageName);}判断是否系统应用 在/system/app 或者 /system/priv-app目录下的应用。 public boolean isSystem(Conte…

Redis入门-五种数据类型

大家好我是苏麟 , 今天来说说Reids五种基本数据类型 . 五种常用数据类型介绍 大纲 字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令 Redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种常用的数据类型&…

导入导出(excel格式/压缩包格式导出至response、excel导入)

目录 导出一、excel格式导出至response1、List<对象>导出2、json对象不固定列导出 二、压缩包格式导出至response使用Hutool工具简化代码 导入一、对象导入二、不固定列导入 导出 一、excel格式导出至response 1、List<对象>导出 Map<String, String> hea…

零基础学Python网络爬虫案例实战全流程详解(入门与提高篇)

零基础学Python网络爬虫案例实战 全流程详解 入门与提高篇 零基础学Python网络爬虫案例实战 全流程详解 高级进阶篇 内容简介 在大数据时代的今天&#xff0c;无论是产品开始还是精准化营销越来越离不开大数据的支持&#xff0c;如何从浩瀚的网络中获取自己想要的大数据&…

用 Socket.D 替代原生 WebSocket 做前端开发

socket.d.js 是基于 websocket 包装的 socket.d 协议的实现。就是用 ws 传输数据&#xff0c;但功能更强大。 功能原生 websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应&#xff08;类似于 http&#xff09;sendAndSubscribe无…

PyTorch 简单易懂的实现 CosineSimilarity 和 PairwiseDistance - 距离度量的操作

目录 torch.nn子模块Distance Functions解析 nn.CosineSimilarity 功能 主要参数 输入和输出的形状 使用示例 nn.PairwiseDistance 功能 主要参数 输入和输出的形状 使用示例 总结 torch.nn子模块​​​​​​​Distance Functions解析 nn.CosineSimilarity torc…

【图神经网络导论】之第9章模型变体(刘知远)

第9章不同图类型的模型变体 文章目录 第9章不同图类型的模型变体9.1 有向图9.2 异构图9.3 带有边信息的图9.4 动态图9.5 多维图 第4章介绍的基础GNN模型"被用于处理无向图&#xff0c;这些图包含具有标签的节点&#xff0c;是最简单的图。然而&#xff0c;在现实世界中还有…

Linux基础知识点(八-POSXI互斥锁)

目录 一、互斥锁基本概念 1.1 互斥相关背景概念 1.2 互斥锁(mutex) 1.3 死锁 二、初始化互斥锁 2.1 静态初始化 2.2 动态初始化 三、获取与释放互斥锁 四、销毁互斥锁 一、互斥锁基本概念 1.1 互斥相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做…