数据结构初阶:排序
本期博客我们来到了初阶数据结构最后一个知识点:排序
排序,我们从小到大就一直在接触,按身高、成绩、学号等等不同的排序我们已经历许多,那么各位是按怎样的方法进行排序的呢?
废话不多说这期博客我们对各种排序方法进行总结:
目录
一、排序的概念
二、常见的排序算法
三、常见的排序算法实现
3.1 直接插入排序
3.1.1 基本思想
3.1.2 代码实现
3.2 希尔排序
3.2.1 基本思想
3.2.2 代码实现
3.3 直接选择排序
3.3.1 基本思想
3.3.2 代码实现
3.4 堆排序
3.4.1 基本思想
3.4.1 代码实现
3.5 冒泡排序
3.5.1 基本思想
3.5.2 代码实现
3.6 快速排序(递归)
3.6.1 Hoare版本快速排序基本思想
3.6.2 Hoare版本快速排序代码实现
3.6.3 挖坑法版本快速排序基本思想
3.6.4 挖坑法版本快速排序代码实现
3.6.5 前后指针版本快速排序基本思想
3.6.6 前后指针版本快速排序代码实现
3.7 快速排序(非递归)
3.7.1 非递归快速排序的基本思想
3.7.2 非递归快速排序的代码实现
3.8 归并排序(递归)
3.8.1 归并排序基本思想
3.8.2 归并排序代码实现
3.9 归并排序(非递归)
3.8.1 非递归归并排序基本思想
3.8.2 非递归归并排序代码实现
3.9 计数排序
3.9.1 计数排序的基本思想
3.9.2 计数排序代码实现
四、所有排序算法总结
五、性能测试
5.1 测试代码
5.2 测试结果
六、排序算法全部代码
一、排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
二、常见的排序算法
三、常见的排序算法实现
3.1 直接插入排序
直接插入排序是简单的排序方法,无脑比较后插入即可
3.1.1 基本思想
即把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
实际中我们玩扑克牌时,就用了插入排序的思想。
下面是插入排序模拟图(按升序排序):
可以看出,直接插入排序方法的时间复杂度为:O(n^2),但是其效率会随着数据的有序性升高而提升。
3.1.2 代码实现
void InsertSort(int *a,int n)
{for (int i = 0; i < n - 1; i++){int end = i, temp;//end记录已排完元素的个数temp = a[end + 1];//temp保存插入元素while (end >= 0)//找到合适的插入位置{if (temp < a[end]){a[end + 1] = a[end];end--;}elsebreak;}a[end + 1] = temp;//插入}
}
3.2 希尔排序
希尔排序建立在直接插入排序基础之上是对其的优化,主要就是先分组再使用直接插入排序。
3.2.1 基本思想
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数gap,把待排序文件中所有记录分成gap个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行直接插入排序。然后,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。
下面是希尔排序举例模拟图(按升序排列):
本次举例只讲述了一次将数组分为gap组的排序,实际在进行整体排序之前gap值可以多次改变,以此来进行多次预排序
希尔排序的时间复杂度不好计算,因为gap的取值方法很多,并且在预排序中数组越来越接近有序,导致很难去计算,因此在一些书中给出的希尔排序的时间复杂度都不固定。我们时间复杂度暂时就按:O(n^1.3)来算。
3.2.2 代码实现
void ShellSort(int* a, int n)
{int gap = n;//gap不为1之前进行预排序//gap值等于1时进行整体的直接插入排序while (gap > 1){gap = gap / 3 + 1;//不断改变gap值进行多次预排序,+1是为了保证gap值最后一次为1for (int j = 0; j < gap; j++)//将整个数组分为gap组,每一组进行直接插入排序{for (int i = j; i < n - gap; i += gap)//一组进行直接插入排序{int temp, end = i;//end记录已排完元素的个数temp = a[end + gap];//temp保存插入元素while (end >= 0)//在组内找到合适的插入位置{if (temp < a[end]){a[end + gap] = a[end];end -= gap;}elsebreak;}a[end + gap] = temp;//插入}}}
}
3.3 直接选择排序
直接选择排序在这里是最简单的排序方法
3.3.1 基本思想
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
但是这种方法太慢了,我们对其进行改进:每次遍历数组时选择最小和最大的数分别放在数组的起始和结束位置。
下面是改进方法举例模拟图:
该方法的时间复杂度是:O(n^2),不如直接插入排序的效率(直接选择排序时间复杂度不会随数据的变化而变化)
3.3.2 代码实现
void Swap(int* a, int* b)//交换函数
{int temp = *b;*b = *a;*a = temp;
}
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1, mini, maxi;while (begin < end){mini = begin;maxi = begin;for (int i = begin + 1; i <= end; i++)//找到最大与最小值{if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[mini], &a[begin]);//交换if (maxi == begin)//防止数据出现重叠,如果出现重叠需要进行位置更新{maxi = mini;}Swap(&a[maxi], &a[end]);//交换begin++;end--;}
}
3.4 堆排序
3.4.1 基本思想
堆排序在之前的树与二叉树——堆中详细讲过,这里不再赘述,直接附上链接:
数据结构初阶:树与二叉树——堆
3.4.1 代码实现
void AdjustDown(int* data, int n,int parent)//向下调整
{int chlid = parent * 2 + 1;//找到其左孩子while (chlid < n)//防止数组越界{if (data[chlid + 1] > data[chlid] && chlid + 1 < n)//判断左右孩子的大小,chlid + 1 < n要防止存在左孩子而无右孩子时的数组越界(想要按小堆调整需将前一个>改为<号){chlid += 1;}if (data[chlid] > data[parent])//(想要按小堆调整需将 > 改为 < 号){Swap(&data[chlid], &data[parent]);//将大的孩子元素与其替换//继续向下比较替换parent = chlid;chlid = parent * 2 + 1;}else//如果孩子元素都没有其父元素大则直接跳出{break;}}
}void HeapSort(int* a, int n)
{for (int i = (n - 1 - 1) / 2; i >= 0; i--)//n-1是最后一个元素的物理位置((n-1)-1)/2是其父节点的物理位置{AdjustDown(a, n, i);//向下调整}int end = n - 1;while (end > 0){Swap(&a[end], &a[0]);//每一次调整之后将最大的元素挪到堆的最后面AdjustDown(a,end,0);end--;}
}
3.5 冒泡排序
冒泡排序,对于计算机类的同学再熟悉不过了
3.5.1 基本思想
遍历n-1(n为数组元素个数)次数组,每次遍历时比较相邻的两个元素将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动,这样每次遍历完数组最大值都会被带到数组末尾,下一次遍历时就可以少遍历一个数据。
思路模拟举例图(按升序排序):
这样整个数组就排序完成了。
在这里冒泡排序的时间复杂度为:O(n^2)
3.5.2 代码实现
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){for (int j = 1; j < n - i; j++){if (a[j - 1] > a[j]){Swap(&a[j - 1], &a[j]);}}}
}
我们可以对其优化一下,当某一趟冒泡排序没有进行交换时(说明所有数据都有序了)直接跳出:
优化后的代码:
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){int exchange = 0;//exchange判断排序时是否进行了交换for (int j = 1; j < n - i; j++){if (a[j - 1] > a[j]){Swap(&a[j - 1], &a[j]);exchange = 1;}}if (exchange == 0){break;//没有进行交换进行跳出}}
}
3.6 快速排序(递归)
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法
3.6.1 Hoare版本快速排序基本思想
任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
下面是快速排序思路举例举例模拟图:
我们先以数组元素第一个值为基准(基准也可以定为数组元素最后一个值,视具体情况而定),进行快速排序的第一次排序:
我们发现本次排序过后基准元素前面的元素值全小于其基准值,基准元素后面的元素值全大于其值
这样一来基准元素在整体的数组中位置已经是正确的了,不需要对其再进行操作。
这样我们就可以将整个数组拆为基准元素前半部分和后半部分,对其分别再进行上述排序操作:
本次分为两组的排序分别已经完成,我们需要对其继续进行拆分再进行排序:
最后一次排序完成,整体快速排序结束。
在快速排序中,按升序排序时为了保证L和R指针相遇位置比基准值要小,在第一个元素做基准值时R指针要先走,在最后个元素做基准值时L指针要先走。
在理想情况下,假如每次取的基准值都在数组元素的中间值(这样每次进行拆分时都可以分掉数组的一半),快速排序算法的时间复杂度为:O(N*㏒⑵N)
在数组趋近于有序时,这样会导致每次进行拆分数组时一边元素极多一边元素极少,元素极多的数组会增加后续继续分组的次数,所以在最坏情况下快速排序算法的时间复杂度为:O(N^2)
该方法在递归时需要建立函数栈帧,所以空间复杂度为:O(N*㏒⑵N)
3.6.2 Hoare版本快速排序代码实现
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;int left = begin, right = end;int keyi = left;//确定基准元素下标while (left < right){while (left < right && a[right] >= a[keyi])//left<right是为了防止数组越界{right--;}while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);keyi = left;//交换过后基准元素下标改变,需要更新QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分
}
为了避免最坏情况的发生,我们可以使用三数取中的方法(即选取数组中开始、中间、末尾三个数值在中间的数来作为基准数),优化代码如下:
int GetMidIndx(int* a, int begin, int end)//三数取中
{int mid = (begin + end) / 2;if (a[begin] < a[mid]){if (a[mid] < a[end])return mid;else if (a[begin] > a[end])return begin;elsereturn end;}else{if (a[end] < a[mid])return mid;else if (a[end] > a[begin])return begin;elsereturn end;}
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;int mid = GetMidIndx(a, begin, end);//三数取中Swap(&a[begin], &a[mid]);//取中后交换元素位置int left = begin, right = end;int keyi = begin;//确定基准元素下标while (left < right){while (left < right && a[right] >= a[keyi])//left<right是为了防止数组越界{right--;}while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);keyi = left;//交换过后基准元素下标改变,需要更新QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分
}
在我们进行递归时,遇到小区间的数组(数组元素个数较少)时,可以不再进行拆分递归,而是直接对小区间数组进行直接插入排序来减少递归的消耗来提升效率,再优化代码如下:
int GetMidIndx(int* a, int begin, int end)//三数取中
{int mid = (begin + end) / 2;if (a[begin] < a[mid]){if (a[mid] < a[end])return mid;else if (a[begin] > a[end])return begin;elsereturn end;}else{if (a[end] < a[mid])return mid;else if (a[end] > a[begin])return begin;elsereturn end;}
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;if ((end - begin + 1) <= 10)//遇到小区间数组直接插入排序,10只是一种取值,取值视情况而定{InsertSort(&a[begin], end - begin + 1);}else{int mid = GetMidIndx(a, begin, end);//三数取中Swap(&a[begin], &a[mid]);//取中后交换元素位置int left = begin, right = end;int keyi = begin;//确定基准元素下标while (left < right){while (left < right && a[right] >= a[keyi])//left<right是为了防止数组越界{right--;}while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);keyi = left;//交换过后基准元素下标改变,需要更新QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分}
}
3.6.3 挖坑法版本快速排序基本思想
挖坑法比Hoare版本更容易理解,即进行排序时,提取基准元素(基准元素的位置就空缺了),在R指针移动后将找到的元素直接填到基准元素的位置上(R指向的元素的位置就空缺了),接着在L指针移动过后将找到的元素直接填到R所在元素的位置上(L指向的元素的位置就空缺了),然后R再开始移动接着填补L指针上的位置元素(R指向的元素的位置再次空缺)·········这样重复每次找到元素之后R和L指针必有一个位置是空缺的,等到它们相遇时将基准元素填补到它们所在的位置上即可。
这样单次遍历结束。接下来进行拆分数组一直进行此排序。
3.6.4 挖坑法版本快速排序代码实现
int PartSort2(int* a, int begin, int end)
{int mid = GetMidIndx(a, begin, end);//三数取中Swap(&a[begin], &a[mid]);//取中后交换元素位置int left = begin, right = end;int key = a[begin];int hole = left;//记录空缺元素位置while (left < right){while (left < right && a[right] >= key)//left<right是为了防止数组越界{right--;}a[hole] = a[right];//填补空缺位置hole = right;//更新空缺位置while (left < right && a[left] <= key){left++;}a[hole] = a[left];//填补空缺位置hole = left;//更新空缺位置}a[hole] = key;//最后将基准元素插入到空缺位置return hole;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;if ((end - begin + 1) <= 10)//遇到小区间数组直接插入排序,10只是一种取值,取值视情况而定{InsertSort(&a[begin], end - begin + 1);}else{int keyi = PartSort2(a, begin, end);//挖坑法QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分}
}
3.6.5 前后指针版本快速排序基本思想
前后指针版本在排序时会有一前一后两个指针(前指针prev,后指针cur),排序时初始前指针prev在基准元素位(数组首元素位),后指针cur在prev指针后一个元素位置。接着cur指针开始移动找到比基准元素小的元素停住(找到比基准元素大的元素就继续向前移动),此时prev指针向前移动一位后将所在位置元素与cur指针所在元素交换。接着cur指针继续向前移动,按上述规律遇到比基准元素小的元素就与prev指针向前移动一位后将所在位置元素交换,一直到cur指针遍历完整个数组。cur遍历完整个数组后再将基准元与prev指针所在元素位置继续交换。
这样单次遍历结束。接下来进行拆分数组一直进行此排序。
下面是对数组进行单次前后指针版本快速排序的基本思想举例图:
单次排序完成,接着就以基准元素对数组进行拆分继续排序,这里不再进行举例。
3.6.6 前后指针版本快速排序代码实现
int PartSort3(int* a, int begin, int end)
{int prev = begin, cur = begin + 1, key = a[begin];while (cur <= end){while (cur <= end && a[cur] >= key)//一直找到比key小的元素{cur++;}Swap(&a[++prev], &a[cur++]);//找到了进行交换}Swap(&a[prev], &a[begin]);//最后进行基准元素与prev所在的元素进行交换return prev;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;if ((end - begin + 1) <= 10)//遇到小区间数组直接插入排序,10只是一种取值,取值视情况而定{InsertSort(&a[begin], end - begin + 1);}else{int keyi = PartSort3(a, begin, end);//前后指针版本QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分}
}
但是这样有一种特殊情况:prev和cur指针在同一位置进行交换是没有意义的,所以我们加上一个判断条件优化一下代码:
int PartSort3(int* a, int begin, int end)
{int prev = begin, cur = begin + 1, key = a[begin];while (cur <= end){if (a[cur] < key && ++prev != cur)//找到比key小的元素并且prev和cur不在同一位置时进行交换{Swap(&a[prev], &a[cur]);//找到了进行交换}cur++;}Swap(&a[prev], &a[begin]);//最后进行基准元素与prev所在的元素进行交换return prev;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;if ((end - begin + 1) <= 10)//遇到小区间数组直接插入排序,10只是一种取值,取值视情况而定{InsertSort(&a[begin], end - begin + 1);}else{int keyi = PartSort3(a, begin, end);//前后指针版本QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分}
}
看了上述代码,各位是不是有这样一种感觉:虽然前后指针版本相对抽像,但是代码更简洁呢?
3.7 快速排序(非递归)
在理解了快速排序的递归方法之后,我们进行递归方法来实现快速排序时会有栈溢出的风险。
为了规避这些风险提升快速排序效率我们现在来挑战一下非递归的写法:
3.7.1 非递归快速排序的基本思想
对于递归方法,递归时最重要的就是建立函数栈帧来一层一层来保存所要进行数组拆分的区间。
当不使用递归方法时,我们可以建立一个栈来保存这些所要进行拆分的区间,即在每一次单次排序完返回基准元素位置时将基准元素位置的两边的区间进行入栈,下一次排序时就出栈一个区间来进行排序,直到栈空时就不再单次进行排序了。
在这里我们需要一下对栈进行操作的基本函数:
// 支持动态增长的栈
typedef struct Stack
{int* _a;int _top; // 栈顶int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->_a = (int*)malloc(sizeof(int) * 4);if (ps->_a == NULL){perror("malloc");exit(-1);}ps->_capacity = 4;ps->_top = 0;
}
// 入栈
void StackPush(Stack* ps, int data)
{assert(ps);//传入的指针不能为空if (ps->_capacity == ps->_top)//判断栈是否已满,满了就扩容{int* temp = (int*)realloc(ps->_a, (ps->_capacity + 4) * sizeof(int));if (temp == NULL){perror("realloc");exit(-1);}ps->_a = temp;ps->_capacity += 4;}ps->_a[ps->_top] = data;//向栈内添加数据ps->_top++;//栈顶增加1
}
// 出栈
void StackPop(Stack* ps)
{assert(ps);//传入的指针不能为空if (ps->_top <= 0)//栈空就不可出栈了return;ps->_top--;
}
// 获取栈顶元素
int StackTop(Stack* ps)
{assert(ps);//传入的指针不能为空assert(ps->_top > 0);//栈不能为空return ps->_a[ps->_top - 1];//返回栈顶元素
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps)
{assert(ps);//传入的指针不能为空return ps->_top == 0;//判断栈是否为空
}
// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);//传入的指针不能为空free(ps->_a);//释放栈数据空间ps->_capacity = 0;//初始栈容量为4ps->_top = 0;//初始栈内元素为0
}
3.7.2 非递归快速排序的代码实现
void QuickSortNotR(int* a, int begin, int end)
{//建栈Stack s;StackInit(&s);//入栈StackPush(&s, begin);StackPush(&s, end);while (!StackEmpty(&s))//栈不为空就进行排序{//出一个区间进行排序int right = StackTop(&s);StackPop(&s);int left = StackTop(&s);StackPop(&s);int keyi = PartSort3(a, left, right);//排序完判断是否继续进行拆分,如果满足条件就将区间入栈继续进行排序if (keyi + 1 < right){StackPush(&s, keyi + 1);StackPush(&s, right);}if (keyi - 1 > left){StackPush(&s, left);StackPush(&s, keyi - 1);}}StackDestroy(&s);//排序完成销毁栈
}
3.8 归并排序(递归)
3.8.1 归并排序基本思想
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
就是将一个数组不断二分,直到不能再分为止,再将不能再分的数组两两排序成一个有序数组,再将排序的完的数组再两两排序成一个有序数组,安此方法一直排序合成一整个数组。
下面的是归并排序思路举例模拟图:
归并排序的时间复杂度为:O(N*㏒⑵N)
但是归并排序需要开辟一个临时数组来保存归并时的数据,所以空间复杂度为:O(N)
3.8.2 归并排序代码实现
void _MergeSort(int* a, int* temp, int begin, int end)
{if (end <= begin)//判断是否要对数组进行二分return;//递归进行数组二分int mid = (begin + end) / 2;_MergeSort(a, temp, begin, mid);_MergeSort(a, temp, mid + 1, end);//归并二分后的数组int begin1 = begin, end1 = mid, begin2 = mid + 1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end){if (a[begin1] < a[begin2]){temp[i++] = a[begin1++];}else{temp[i++] = a[begin2++];}}while (begin1 <= end1){temp[i++] = a[begin1++];}while (begin2 <= end2){temp[i++] = a[begin2++];}memcpy(a + begin, temp + begin, sizeof(int) * (end - begin + 1));//将归并完的临时数组拷贝到原数组中
}
void MergeSort(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);//临时数组用来保存归并后的数组if (temp == NULL){perror("malloc");exit(-1);}_MergeSort(a, temp, 0, n - 1);free(temp);temp = NULL;
}
3.9 归并排序(非递归)
3.8.1 非递归归并排序基本思想
在非递归中实现归并排序,我们可以直接先将数组按rangeN(每组归并元素的个数)来一一归并。rangN初始值为1,即将整个数组每个元素两两一一归并,这样归并后再将rangN乘以2再次归并,以此类推一直到rangN的值大于等于数组元素个数时结束归并,整个数组排序完成。
下面是非递归归并排序思路举例模拟图:
3.8.2 非递归归并排序代码实现
注意非2倍数元素个数的数组归并时存在数组越界的问题,要进行判断修正。
void MergeSortNotR(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);//临时数组用来保存归并后的数组if (temp == NULL){perror("malloc");exit(-1);}int rangeN = 1;while (rangeN < n){for (int j = 0; j < n; j += 2 * rangeN){int begin1 = j, end1 = j + rangeN - 1;int begin2 = end1 + 1, end2 = begin2 + rangeN - 1;//判断区间是否越界if (end1 >= n)//end1,begin2,end2越界{break;//直接跳出}if (begin2 >= n)//begin2,end2越界{break;//直接跳出}if (end2 >= n)//end2越界{end2 = n - 1;//修正end2后继续归并}//将两组含rangN个元素的区间进行归并int i = j;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i++] = a[begin1++];}else{temp[i++] = a[begin2++];}}while (begin1 <= end1){temp[i++] = a[begin1++];}while (begin2 <= end2){temp[i++] = a[begin2++];}//将归并完的临时数组拷贝到原数组中(归并一拷一组)memcpy(a + j, temp + j, sizeof(int) * (end2 - j + 1));}rangeN *= 2;}free(temp);temp = NULL;
}
3.9 计数排序
3.9.1 计数排序的基本思想
计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。
该排序先要开辟一个range(排序数组最大元素和最小元素之差再加一)大小的数组来统计相同元素出现次数,再根据统计的结果将序列回收到原来的序列中。
下面是计数排序思路举例模拟图:
该算法的时间复杂度为:O(N+range)
空间复杂度为:O(range)
从时间复杂度可以看出此方法适用于range比N小的数组排序(即元素值不分散的数组),并且只适用于整型(如浮点型就无能为力了),局限性较强。
3.9.2 计数排序代码实现
void CountSort(int* a, int n)
{//统计排序数组中最大最小值之差加1int max = a[0], min = a[0];for (int i = 0; i < n; i++){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;//开辟新数组int* count = (int*)calloc(range, sizeof(int));if (count == NULL){perror("calloc");exit(-1);}//统计相同元素出现次数for (int i = 0; i < n; i++){count[a[i] - min]++;}//将统计的结果将序列回收到原来的序列int k = 0;for (int i = 0; i < range; i++){while (count[i]--){a[k++] = i + min;}}free(count);count = NULL;
}
四、所有排序算法总结
五、性能测试
理论上说说可不行,我们不能只限于纸上谈兵,下面我们来到了我们最激动人心的测试环结
5.1 测试代码
void TestOP(const int N)
{srand(time(0));int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);int* a4 = (int*)malloc(sizeof(int) * N);int* a5 = (int*)malloc(sizeof(int) * N);int* a6 = (int*)malloc(sizeof(int) * N);int* a7 = (int*)malloc(sizeof(int) * N);int* a8 = (int*)malloc(sizeof(int) * N);int* a9 = (int*)malloc(sizeof(int) * N);int* a10 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand() + 1;a2[i] = a1[i];a3[i] = a1[i];a4[i] = a1[i];a5[i] = a1[i];a6[i] = a1[i];a7[i] = a1[i];a8[i] = a1[i];a9[i] = a1[i];a10[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();int begin3 = clock();SelectSort(a3, N);int end3 = clock();int begin4 = clock();HeapSort(a4, N);int end4 = clock();int begin5 = clock();BubbleSort(a5, N);int end5 = clock();int begin6 = clock();QuickSort(a6, 0, N - 1);int end6 = clock();int begin7 = clock();QuickSortNotR(a7, 0, N - 1);int end7 = clock();int begin8 = clock();MergeSort(a8, N);int end8 = clock();int begin9 = clock();MergeSortNotR(a9, N);int end9 = clock();int begin10 = clock();CountSort(a10, N);int end10 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);printf("SelectSort:%d\n", end3 - begin3);printf("HeapSort:%d\n", end4 - begin4);printf("BubbleSort:%d\n", end5 - begin5);printf("QuickSort:%d\n", end6 - begin6);printf("QuickSortNotR:%d\n", end7 - begin7);printf("MergeSort:%d\n", end8 - begin8);printf("MergeSortNotR:%d\n", end9 - begin9);printf("CountSort:%d\n", end10 - begin10);free(a1);free(a2);free(a3);free(a4);free(a5);free(a6);free(a7);free(a8);free(a9);free(a10);
}
5.2 测试结果
排序算法哪家强?请看以下结果(以毫秒为单位):
Debug环境下:
Release环境下:
六、排序算法全部代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#include<time.h>//插入排序
void InsertSort(int *a,int n)
{for (int i = 0; i < n - 1; i++){int end = i, temp;//end记录已排完元素的个数temp = a[end + 1];//temp保存插入元素while (end >= 0)//找到合适的插入位置{if (temp < a[end]){a[end + 1] = a[end];end--;}elsebreak;}a[end + 1] = temp;//插入}
}//希尔排序
void ShellSort(int* a, int n)
{int gap = n;//gap不为1之前进行预排序//gap值等于1时进行整体的直接插入排序while (gap > 1){gap = gap / 3 + 1;//不断改变gap值进行多次预排序,+1是为了保证gap值最后一次为1for (int j = 0; j < gap; j++)//将整个数组分为gap组,每一组进行直接插入排序{for (int i = j; i < n - gap; i += gap)//一组进行直接插入排序{int temp, end = i;//end记录已排完元素的个数temp = a[end + gap];//temp保存插入元素while (end >= 0)//在组内找到合适的插入位置{if (temp < a[end]){a[end + gap] = a[end];end -= gap;}elsebreak;}a[end + gap] = temp;//插入}}}
}
//直接交换排序
void Swap(int* a, int* b)//交换函数
{int temp = *b;*b = *a;*a = temp;
}
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1, mini, maxi;while (begin < end){mini = begin;maxi = begin;for (int i = begin + 1; i <= end; i++)//找到最大与最小值{if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[mini], &a[begin]);//交换if (maxi == begin)//防止数据出现重叠,如果出现重叠需要进行位置更新{maxi = mini;}Swap(&a[maxi], &a[end]);//交换begin++;end--;}
}//堆排序
void AdjustDown(int* data, int n, int parent)//向下调整
{int chlid = parent * 2 + 1;//找到其左孩子while (chlid < n)//防止数组越界{if (data[chlid + 1] > data[chlid] && chlid + 1 < n)//判断左右孩子的大小,chlid + 1 < n要防止存在左孩子而无右孩子时的数组越界(想要按小堆调整需将前一个>改为<号){chlid += 1;}if (data[chlid] > data[parent])//(想要按小堆调整需将 > 改为 < 号){Swap(&data[chlid], &data[parent]);//将大的孩子元素与其替换//继续向下比较替换parent = chlid;chlid = parent * 2 + 1;}else//如果孩子元素都没有其父元素大则直接跳出{break;}}
}
void HeapSort(int* a, int n)
{for (int i = (n - 1 - 1) / 2; i >= 0; i--)//n-1是最后一个元素的物理位置((n-1)-1)/2是其父节点的物理位置{AdjustDown(a, n, i);//向下调整}int end = n - 1;while (end > 0){Swap(&a[end], &a[0]);//每一次调整之后将最大的元素挪到堆的最后面AdjustDown(a, end, 0);end--;}
}//冒泡排序
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){int exchange = 0;//exchange判断排序时是否进行了交换for (int j = 1; j < n - i; j++){if (a[j - 1] > a[j]){Swap(&a[j - 1], &a[j]);exchange = 1;}}if (exchange == 0){break;//没有进行交换进行跳出}}
}//递归快速排序
int GetMidIndx(int* a, int begin, int end)//三数取中
{int mid = (begin + end) / 2;if (a[begin] < a[mid]){if (a[mid] < a[end])return mid;else if (a[begin] > a[end])return begin;elsereturn end;}else{if (a[end] < a[mid])return mid;else if (a[end] > a[begin])return begin;elsereturn end;}
}int PartSort1(int* a, int begin, int end)//Hoare版本
{int mid = GetMidIndx(a, begin, end);//三数取中Swap(&a[begin], &a[mid]);//取中后交换元素位置int left = begin, right = end;int keyi = begin;//确定基准元素下标while (left < right){while (left < right && a[right] >= a[keyi])//left<right是为了防止数组越界{right--;}while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);keyi = left;//交换过后基准元素下标改变,需要更新return keyi;
}int PartSort2(int* a, int begin, int end)//挖坑法
{int mid = GetMidIndx(a, begin, end);//三数取中Swap(&a[begin], &a[mid]);//取中后交换元素位置int left = begin, right = end;int key = a[begin];int hole = left;//记录空缺元素位置while (left < right){while (left < right && a[right] >= key)//left<right是为了防止数组越界{right--;}a[hole] = a[right];//填补空缺位置hole = right;//更新空缺位置while (left < right && a[left] <= key){left++;}a[hole] = a[left];//填补空缺位置hole = left;//更新空缺位置}a[hole] = key;//最后将基准元素插入到空缺位置return hole;
}int PartSort3(int* a, int begin, int end)//前后指针版本
{int prev = begin, cur = begin + 1, key = a[begin];while (cur <= end){if (a[cur] < key && ++prev != cur)//找到比key小的元素并且prev和cur不在同一位置时进行交换{Swap(&a[prev], &a[cur]);//找到了进行交换}cur++;}Swap(&a[prev], &a[begin]);//最后进行基准元素与prev所在的元素进行交换return prev;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end)//递归判断return;if ((end - begin + 1) <= 10)//遇到小区间数组直接插入排序,10只是一种取值,取值视情况而定{InsertSort(&a[begin], end - begin + 1);}else{//int keyi = PartSort1(a, begin, end);//Hoare版本//int keyi = PartSort2(a, begin, end);//挖坑法int keyi = PartSort3(a, begin, end);//前后指针版本QuickSort(a, begin, keyi - 1);//递归拆分基准值左半部分QuickSort(a, keyi + 1, end);//递归拆分基准值右半部分}
}// 支持动态增长的栈
typedef struct Stack
{int* _a;int _top; // 栈顶int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->_a = (int*)malloc(sizeof(int) * 4);if (ps->_a == NULL){perror("malloc");exit(-1);}ps->_capacity = 4;ps->_top = 0;
}
// 入栈
void StackPush(Stack* ps, int data)
{assert(ps);//传入的指针不能为空if (ps->_capacity == ps->_top)//判断栈是否已满,满了就扩容{int* temp = (int*)realloc(ps->_a, (ps->_capacity + 4) * sizeof(int));if (temp == NULL){perror("realloc");exit(-1);}ps->_a = temp;ps->_capacity += 4;}ps->_a[ps->_top] = data;//向栈内添加数据ps->_top++;//栈顶增加1
}
// 出栈
void StackPop(Stack* ps)
{assert(ps);//传入的指针不能为空if (ps->_top <= 0)//栈空就不可出栈了return;ps->_top--;
}
// 获取栈顶元素
int StackTop(Stack* ps)
{assert(ps);//传入的指针不能为空assert(ps->_top > 0);//栈不能为空return ps->_a[ps->_top - 1];//返回栈顶元素
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps)
{assert(ps);//传入的指针不能为空return ps->_top == 0;//判断栈是否为空
}
// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);//传入的指针不能为空free(ps->_a);//释放栈数据空间ps->_capacity = 0;//初始栈容量为4ps->_top = 0;//初始栈内元素为0
}
//非递归快速排序
void QuickSortNotR(int* a, int begin, int end)
{//建栈Stack s;StackInit(&s);//入栈StackPush(&s, begin);StackPush(&s, end);while (!StackEmpty(&s))//栈不为空就进行排序{//出一个区间进行排序int right = StackTop(&s);StackPop(&s);int left = StackTop(&s);StackPop(&s);int keyi = PartSort3(a, left, right);//排序完判断是否继续进行拆分,如果满足条件就将区间入栈继续进行排序if (keyi + 1 < right){StackPush(&s, keyi + 1);StackPush(&s, right);}if (keyi - 1 > left){StackPush(&s, left);StackPush(&s, keyi - 1);}}StackDestroy(&s);//排序完成销毁栈
}//递归归并排序
void _MergeSort(int* a, int* temp, int begin, int end)
{if (end <= begin)//判断是否要对数组进行二分return;//递归进行数组二分int mid = (begin + end) / 2;_MergeSort(a, temp, begin, mid);_MergeSort(a, temp, mid + 1, end);//归并二分后的数组int begin1 = begin, end1 = mid, begin2 = mid + 1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end){if (a[begin1] < a[begin2]){temp[i++] = a[begin1++];}else{temp[i++] = a[begin2++];}}while (begin1 <= end1){temp[i++] = a[begin1++];}while (begin2 <= end2){temp[i++] = a[begin2++];}memcpy(a + begin, temp + begin, sizeof(int) * (end - begin + 1));//将归并完的临时数组拷贝到原数组中
}
void MergeSort(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);//临时数组用来保存归并后的数组if (temp == NULL){perror("malloc");exit(-1);}_MergeSort(a, temp, 0, n - 1);free(temp);temp = NULL;
}//非递归归并排序
void MergeSortNotR(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);//临时数组用来保存归并后的数组if (temp == NULL){perror("malloc");exit(-1);}int rangeN = 1;while (rangeN < n){for (int j = 0; j < n; j += 2 * rangeN){int begin1 = j, end1 = j + rangeN - 1;int begin2 = end1 + 1, end2 = begin2 + rangeN - 1;//判断区间是否越界if (end1 >= n)//end1,begin2,end2越界{break;//直接跳出}if (begin2 >= n)//begin2,end2越界{break;//直接跳出}if (end2 >= n)//end2越界{end2 = n - 1;//修正end2后继续归并}//将两组含rangN个元素的区间进行归并int i = j;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i++] = a[begin1++];}else{temp[i++] = a[begin2++];}}while (begin1 <= end1){temp[i++] = a[begin1++];}while (begin2 <= end2){temp[i++] = a[begin2++];}//将归并完的临时数组拷贝到原数组中(归并一拷一组)memcpy(a + j, temp + j, sizeof(int) * (end2 - j + 1));}rangeN *= 2;}free(temp);temp = NULL;
}//计数排序
void CountSort(int* a, int n)
{//统计排序数组中最大最小值之差加1int max = a[0], min = a[0];for (int i = 0; i < n; i++){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;//开辟新数组int* count = (int*)calloc(range, sizeof(int));if (count == NULL){perror("calloc");exit(-1);}//统计相同元素出现次数for (int i = 0; i < n; i++){count[a[i] - min]++;}//将统计的结果将序列回收到原来的序列int k = 0;for (int i = 0; i < range; i++){while (count[i]--){a[k++] = i + min;}}free(count);count = NULL;
}// 测试排序的性能对比
void TestOP(const int N)
{srand(time(0));int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);int* a4 = (int*)malloc(sizeof(int) * N);int* a5 = (int*)malloc(sizeof(int) * N);int* a6 = (int*)malloc(sizeof(int) * N);int* a7 = (int*)malloc(sizeof(int) * N);int* a8 = (int*)malloc(sizeof(int) * N);int* a9 = (int*)malloc(sizeof(int) * N);int* a10 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand() + 1;a2[i] = a1[i];a3[i] = a1[i];a4[i] = a1[i];a5[i] = a1[i];a6[i] = a1[i];a7[i] = a1[i];a8[i] = a1[i];a9[i] = a1[i];a10[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();int begin3 = clock();SelectSort(a3, N);int end3 = clock();int begin4 = clock();HeapSort(a4, N);int end4 = clock();int begin5 = clock();BubbleSort(a5, N);int end5 = clock();int begin6 = clock();QuickSort(a6, 0, N - 1);int end6 = clock();int begin7 = clock();QuickSortNotR(a7, 0, N - 1);int end7 = clock();int begin8 = clock();MergeSort(a8, N);int end8 = clock();int begin9 = clock();MergeSortNotR(a9, N);int end9 = clock();int begin10 = clock();CountSort(a10, N);int end10 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);printf("SelectSort:%d\n", end3 - begin3);printf("HeapSort:%d\n", end4 - begin4);printf("BubbleSort:%d\n", end5 - begin5);printf("QuickSort:%d\n", end6 - begin6);printf("QuickSortNotR:%d\n", end7 - begin7);printf("MergeSort:%d\n", end8 - begin8);printf("MergeSortNotR:%d\n", end9 - begin9);printf("CountSort:%d\n", end10 - begin10);free(a1);free(a2);free(a3);free(a4);free(a5);free(a6);free(a7);free(a8);free(a9);free(a10);
}
本期博客到这里就全部结束了,代码量庞大若有纰漏还请大佬在评论区指出呀~
目前数据结构初阶的知识点已经全部结束了,下面会给大家带来一些经典例题的讲解,请各位看客不要走开哦~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4507520.html
如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!
linux socket 错误处理,Linux - socket编程处理EINTR错误
在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interruptedsystem call. 这里给出一个connect连接中对EINTR处理的网址:另外转载网络上其他兄弟对EINTR错误的处理&#x…...

c语言操作字节,C语言文件操作
对计算机来说,一切皆数据,超女的信息是数据、C语言源代码文件是数据、编译后的可执行程序也是数据,数据的存放方式有很多种,如内存、文件、数据库等,文件是极其重要的一种。根据文件中数据组织形式的不同,可…...

c语言限流,C语言—栈
栈的操作:进栈和出栈#include "stdafx.h"#include "stack.h"#define maxsize 20typedef int Elemtype;/*顺序存储—数组形式*/struct stack{int data[maxsize];int top;};void init(struct stack *ps){ps->top -;}void init2(struct Double…...

尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]
尚硅谷传送门>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! ml情景引入观察者模式情景引入 天气预报项目需求: 1 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(发布到自己的网站或第三…...

EINTR的捕获处理
EINTR:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。 信号 SA_RESTART 标志的设置:但不方便于移植,大多数Berkeley的实现从不自动重启select,其中有些实…...

卷积神经网络参数量计算(模型参数,内存占用,显存占用)
0.计算卷积神经网络参数的两种方式 利用torchstat,利用torchsummary。 pip install torchsummary pip install torchstat 具体实现步骤(可以试试其他卷积模型)。 from torchstat import stat import torchvision.models as models from torchsummary import su…...

CentOS 安装多种×××打造Linux的全能播放器
安装完成cetos系统之后发现什么软件都没有,想看DVD也不行,想装播放器软件也不行。原因是centos默认的源没有此软件,为此我们必须换一个新的源,在装一些播放插件即可。 第一步:加入 RPMforge 软件库(是大多数…...

第一周学习周总结
不知不觉已经学习Java已经一周了,就目前来已经对Java已经有了初步的了解,但总感觉也是模模糊糊的,感觉记住了,又感觉没有记住,在用的时候还是要对照着笔记,感觉自己好像会又好像不会的样子,总的…...

R时间序列分析|SP500股指的ARIMA模型预测与残差ARCH效应分析
R时间序列分析|S&P500股指的ARIMA模型预测与残差ARCH效应分析前言一、数据及分析目的二、数据探索三、ARIMA模型构建四、残差分析五、模型预测前言 由于R语言对新手并不够友好,网上的资料相对也偏少,导致博主在使用R进行时间序列分析的过程中非常痛…...

不管你是那个linux 发行版本,请到这里更新yum源,也有apt
yum源 http://dag.wieers.com/rpm/FAQ.php#A2 # General Information 1. What is the Dag RPM Repository ? 2. What distributions and architectures are supported ? 3. Why should I use RPMforge repositories ? 4. How can we thank ? # Installati…...

有了独自开,我们离自己开发一套系统还会远吗
前言: 大家好,我是小威,今天给大家分享一个开发平台。能够独自开发一套系统,这想必对开发者是一个福音。下面就为大家介绍一下这个平台,来帮助我们开发自己的系统。 文章目录简单介绍优点优秀案例平台福利总结简单介绍…...

uni-app中使用gzip减小打包体积
uni-app中使用gzip减小打包体积 首先感谢: 我怎么会这么穷 这位老哥 话不多说下面开始 1.创建vue.config.js 因为uni是根据vue开发的所以支持vue.config.js 在根目录创建空的文件改名为 vue.config.js 2.填写文件内容 打开vue.config.js 将代码粘贴ÿ…...

socket中的函数遇见EINTR的处理
转载 : https://blog.csdn.net/benkaoya/article/details/17262053 http://blog.chinaunix.net/uid-21501855-id-4490453.html 这几天,写服务器代码过程当中,遇见EINRT信号的问题,我是借鉴 《unp 》,采用continue或者…...
Mac下 brew 方式的LNMP环境搭建
1 安装前准备 1.1 添加Homebrew官方软件源 brew tap homebrew/versions brew tap homebrew/php1.2 更新brew brew update 2 安装mysql 2.1 安装MySQL brew install mysql成功安装结果 > Caveats > protobuf Emacs Lisp files have been installed to: /usr/local/sh…...

玩一下原神建模
第一步:原神模型下载 原神2.4UP主激励计划 (bilibili.com) 此时注意的是这个是pmx的格式,而Unity中需要.fbx格式文件。因此需要格式转换一下 当然如果没有Unity的要先下载 版本 首先下载Cats Blender Plugin插件 github下载地址:absolute-…...

SecureCRT 连数据库,启动tomcat操作命令
cd / 找到根目录ll 查看详细列表cd .. 回到上一级目录Tab键是补全ctrlc 退出编辑模式;退出是exit;实时输出日志:tail -f 文件名称1.查找日志命令:cd /usr/local/*/logs/catalina.out (*省略的是文件路径名称)2.启动和…...

C语言之数组
一. 一维数组的创建和初始化 1. 数组的创建 数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小 数组创建的实例: //代码1 in…...

大数据时代:Kafka如何做到1秒发布百万条消息
说起Kafka的第一个突出特定就是“快”,而且是那种变态的“快”。据最新的数据:每天利用Kafka处理的消息超过1万亿条,在峰值时每秒钟会发布超过百万条消息,就算是在内存和CPU都不高的情况下,Kafka的速度最高可以达到每秒…...

E. Permutation Game #839 div3
Problem - E - Codeforces 题意是给你一串排列,初始都是红色,然后先后手可以对序列进行三种操作之一,如果先手在最后可以把序列变成正向排序就赢,如果后手可以把序列变成反向排序就是后手赢,问你是先手还是后手还是平…...

linux无人值守安装实验,无人值守批量安装linux操作系统
无人值守批量安装linux操作系统(实验总结)每天都看对着电脑的操作系统,有时候出现了什么问题实在解决不了,我们肯定会选择重做系统的,当然一台两台系统我们还是可以一一搞定,可是我们是否想过要是一次性需要我们安装10台,100台甚至更多台的操作系统的时候,我们还是会那样傻乎乎…...

连接Linux服务器下Oracle数据库提示:ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
该文章借鉴了https://www.cnblogs.com/nichoc/p/6417505.html的示例 提示该异常说明了两个前提,第一是Oracle数据库是开启状态,第二是监听程序处于开启状态 解决步骤: 切换到Oracle用户 su – oracle查看监听状态 lsnrctl status READY说明…...

华为p30的android版本,华为P30稳定版EMUI 11更新来了
原标题:华为P30稳定版EMUI 11更新来了距离华为P30系列稳定版的Android 10更新已经过去一年多了。现在,似乎全球用户都收到了EMUI 11的更新。此次更新的版本号是11.0.0.138,更新版大小为1.8GB,比EMUI 9到EMUI 10的时候要小得多。有…...

井下三专两闭锁的内容_[问答题,简答题] 井下“三专两闭锁”指的是什么?
[问答题,简答题] 井下“三专两闭锁”指的是什么?更多相关问题电算操作人员有权()。A. 修改数据库内容B. 请人代输凭证C. 拒输未审凭证D. 更改程序用友报表系统中,报表的单元类型不包括()。A. 数值单元B. 表样单元C. 字符单元D. 日期单元下列职责中&#…...

MacOS删除打印机软件指引
实践环境: 1、确认要删除的打印机软件,打开【系统偏好设置】→【打印机与扫描仪】; 2、在菜单栏上,单击【前往】→【前往文件夹】键入以下路径 /Library/Printers/PPDs/Contents/Resources/ 3、接着文件右击→【移到废纸篓】&a…...

JavaScript 变量提升和函数提升
文章目录JavaScript 变量提升和函数提升作用域变量提升函数提升变量提升和函数提升的优先级JavaScript 变量提升和函数提升 作用域 在JavaScript中,一个变量的定义与调用都是会在一个固定的范围中的,这个范围我们称之为作用域。 作用域可以分为&#…...

主成分分析(C++ Eigen/OpenCV库)
一、原理 KL(Karhunen-Loeve)变换,也称为Hotelling变换、特征向量变换(Eigenvector-Based Transform)、主成分分析(PCA Principle Component Analysis)等。 KL变换方法是应用最广泛的一种特征提取方法之一࿰…...

【树莓派不吃灰】命令篇① curl命令
目录1. 前言2. curl命令常用参数2.1 不带有任何参数时,curl 就是发出 GET 请求2.2 -i参数打印出服务器回应的 HTTP 标头。2.3 -I参数向服务器发出 HEAD 请求,然会将服务器返回的 HTTP 标头打印出来。2.4 -o参数将服务器的回应保存成文件,等同…...
Oracle 11g ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务问题解决
首先要确认ORacle服务是否开启。 如果Oracle服务是开启的,但还是提示【ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务】,再去检查下: 首先找到listener.ora监听文件,具体位置:D:\app\Administrator\prod…...

无人值守安装Linux系统
无人值守安装系统 📒博客主页: 微笑的段嘉许博客主页 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! 📆51CTO首发时间:🌴2022年10月…...

Laravel 6 教程学习笔记
本文为 《L01 Laravel 教程 - Web 开发实战入门 ( Laravel 6.x )》 课程学习笔记,方便工作中快速查看 Laravel 6 重要知识点。 原文链接:https://www.childsay.com/laravel-6-01-note.html 同步时间:2019-10-12 homestead vagrant 常用操作…...

typeof 与 instanceof 的区别
typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型 使用:typeof(operand) ,operand表示对象或原始值的表达式,其类型将被返回 例如: typeof 1 // number typeof 1 // string typeof undefined // u…...

AT32(五):硬件SPI——驱动LCD屏的一些尝试
总感觉之前的AT32F421板子/片子 有点小毛病,出各种莫名其妙的BUG(实在找不出软件的问题,只能怀疑是硬件 QAQ)。 于是之后咕了很久,最近终于想继续折腾,拿AT32F435画了一块LCD驱动板,准备入坑LV…...

java.net.UnknownHostException:域名
好久没有写问题了!国庆期间遇到了一个域名解析的问题,有https 的域名通过jdk1.6 的客户端环境访问jdk1.8的环境报 java.net.UnknownHostException:域名问题。具体如图: 通过百度好多都说是域名解析错误,我也相信了!然…...

HTTP的发展史
目录HTTP/0.9HTTP/1.0HTTP/1.1HTTP/2HTTP/3HTTP/0.9 HTTP/0.9 是于1991年提出,主要用于学术交流,需求很简单——用在网络之间传递HTML超文本的内容,所以被称为超文本传输协议。 HTTP/0.9 请求流程 HTTP/0.9的实现有以下三个特点࿱…...
口罩要靠抢?这个Python爬虫帮你实时检测、快速下单
希望大家都可以顺利地买到口罩! 在开发者社区中,因为开发者很多已经前往北上广继续搬砖,那么怎样买到稀缺资源口罩就必须要考虑了。近日,cycz 在 GitHub 上开源了一份代码,它可以实时监测京东上的口罩是否有货…...

(1)初识脱壳破解
1 基础要点 破解:大体分为暴力破解(爆破),制作内存补丁,制作内存注册机,追踪算法编写注册机。 壳:常听人说什么加壳,脱壳,壳到底是什么??形象得…...

信息处理与计算机应用基础知识,2019级新生(本科和高职)计算机基础知识水平考试说明...
2019级新生(本科和高职)计算机基础知识水平考试说明前言目前全国几乎所有省(自治区、直辖市)在中学阶段都已经开设信息技术类的课程,并进行学业水平考试。进入我校的大部分同学已经有一定的信息技术素养和计算机应用能力。不过,仍然有一部分同学计算机的…...

MPP数据库简介及架构分析
目录什么是MPP?特性并行处理超大规模数据仓库真正适合什么典型的分析工作量数据集中化线性可伸缩性MPP架构技术特性数据库架构分析Shared EverythingShared DiskShare MemoryShared NothingShared Nothing数据库架构优势什么是MPP? MPP (Massively Paral…...

html页面拼图验证,利用jQuery实现登录框拼图滑块验证代码
特效描述:利用jQuery实现 登录框 拼图滑块 验证代码。利用jQuery实现登录框拼图滑块验证代码代码结构1. 引入CSS2. 引入JS3. HTML代码忍住不哭来段口技imgVer({el:$("#imgVer"),width:260,height:116,img:[images/ver.png,images/ver-1.png,images/ver-2.…...

Spring发展史
作为Spring的高强度使用者,没理由不对Spring的发展历程感到好奇吧?想知道Spring的作者,Spring是怎样一步一步的发展到今天?也想知道未来Spring能绽放怎样异样的光芒? 一、Spring的缔造者 Rod Johnson(罗德…...

【NI Multisim 14.0操作实例——最小系统电路】
目录 序言 🥝1.设置工作环境 🥝 2.设置原理图图纸 🥝 3.设置图纸的标题栏 🥝 4.增加元件 🥝 5.放置电阻 🥝 6.放置无极性电容 🥝 7. 放置可变电容 🥝 8. 放置电感 &#x…...

试用期没到辞职有工资吗?
大家好,我是2010年7月17日到苏州恒业船舶配件有限公司相城凯翔大厦市场部上班,到7月31日,市场部只有两个人,罗总也不是经常在,给我们一点小任务,准时完成,觉得这不是实现人生舞台的地方…...

测试思维面试题最新整理,有它遇到hr不用慌了
前言 马上就要迎来金九银十黄金招聘季了,咱们在面试软件测试工程师岗位时除了一些基本的面试题之外,有些公司还会给面试者出一些测试思维的面试题,今天呢笔者就给大家来聊一些测试思维的面试题,对了文章的末尾还有一份给大家的福…...

centos6 centos7 刷新清除dns缓存
centos6.5 清除dns缓存用 /etc/init.d/nscd restart如下图 centos7以后改了 改成 systemctl restart nscd...

R语言从零到进阶学习笔记(带注释)
#-------------------------------------------# Chapter 06 举个例子 #-------------------------------------------# getwd() #获得当下路径 setwd(/Users/marscolono/Downloads/RData) #设定路径 df <- read.table("ToothGrowth.csv",sep ",",hea…...
精选的AI和机器学习资源清单 | AI开发者必备
本部分资源内容主要是国外的一些AI学习与开发内容,包括AI组织,视频课程,博客,书籍,YouTube频道,Quora,Github,书籍推荐,会议,研究链接,教程等。 …...

openGL绘制小汽车
#include <windows.h> #include"gl.h" #include"glut.h" #include <math.h> static GLfloat xRot 0.0f; static GLfloat yRot 0.0f; void Display(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();glRotat...

pxe无人值守(kickstart)系统批量自动安装——及报错处理
文章目录kickstart 半无人值守**无人值守安装系统**关于kickstart 就不作过多赘述了 , 反正就是节约人力 不必每一台都挂载光盘或u盘一台一台的装,通过pxe 就可以实现不需要光盘和u盘等直接用网络来装系统(但也需要准备服务器镜像挂载到主服务…...

Linux中怎么搭建主DNS、辅助DNS、缓存DNS服务器
文章目录Linux中怎么搭建主DNS、辅助DNS、缓存DNS服务器一、认识DNS:1、DNS概述:2、DNS查询过程:3、DNS常见名词:二、DNS配置:三、搭建DNS服务器:搭建web测试服务器:客户机准备工作:…...

ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务解决办法
ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务解决办法: 1.首先打开cmd命令 查看本地TNSPING配置 是否ok?然后找到 Oracle 安装文件 中 listener.ora文件与tnsnames.ora文件; 路径:E:\app\当前系统的账…...

ecshop微信h5支付php,Ecshop v2.7.3商城使用微信H5支付教程
Ecshop是比较老牌的商城程序,其中Ecshop V2.7.3是很早以前的开源免费版,国内早期由于商城程序缺乏,有很多开发者基于Ecshop V2.7.3开源版开发了很多电商主题,也进行一些二次开发,所以Ecshop V2.7.3 商城源码使用人数不…...

【LVGL应用开发--基于STM32】第2章 LVGL无操作系统移植
文章目录前言2.1 移植准备工作2.2 向工程添加文件2.2.1. 准备基础工程2.2.2. 把LVGL源码移植到工程中2.2.3. 向工程添加文件2.2.4. 添加文件路径2.2.5. Keil5忽略特定的警告2.3 修改工程文件2.3.1 添加LVGL时基2.3.2 向LVGL关联彩屏驱动和触摸2.3.2.1 lv_port_disp_template.c …...

oracle数据库出现“ORA-12541:TNS:无监听程序”解决方法
#发现启动Oracle的时候出错了,真是尴尬 先排查一下看看服务有没有开启来先: OracleOraDb10g_home3TNSListener:服务监听程序(报上面弹框的原因就是因为没开启监听服务程序)OracleServiceORCL:数据库的主服…...

机器学习 vs 深度学习到底有啥区别,为什么更多人选择机器学习
机器学习和深度学习有什么区别?让我们从本文中寻找答案。目标本文中,我们将深度学习与机器学习作比较。我们将逐一了解他们。我们还会讨论他们在各个方面的不同点。除了深度学习和机器学习的比较,我们还将研究它们未来的趋势。对比介绍深度学…...

21个令程序员泪流满面的瞬间 ...
1公司实习生找 Bug2在调试时,将断点设置在错误的位置3当我有一个很棒的调试想法时4偶然间看到自己多年前写的代码5当我第一次启动我的单元测试时6数据库的Delete语句忘了使用限定词where...7明明是个小bug但就是死活修不好......8当我尝试调整生产数据库中的一些东西…...

ECShop商城系统ecshopv2.7.3支持PHP5.3 5.4 5.5等版本
https://download.csdn.net/download/hqx012829/10277269...

LeetCode题解 回溯(四):90 子集II;491 递增子序列;46 全排列;47 全排列II
90 子集II medium 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 这道题目和子集的区别在于这道题目中给出…...

linux 虚拟内存 java,Java程序在Linux上运行虚拟内存耗用很大
突然集群的2个节点挂了,通过top查看, 虚拟内存22G,通过 pmap -x 8 | grep anon一大堆64MLinux下glibc的内存管理机制用了一个很奇妙的东西,叫arena。在glibc分配内存的时候,大内存从从中央分配区分配,小内存…...

Nginx(二十三)nginx的dns缓存问题
一 问题的背景 ① 问题一 "分割线1"1. 同事1:晚上做nginx正向代理变更要出公网,变更前检测域名无法解析2. 根因:同事0白天做变更的时候,不小心把/etc/resolv.conf中的ip由公网ip修改为内网ip,但是当时不感知;ps: /etc/resolv.conf修…...

简历浅析
精益技术简历之道——改善技术简历的47条原则 原文链接:http://lucida.me/blog/lean-technical-resume/ 关于 这篇文章围绕着技术简历这个话题,从版式、个人信息、技术能力、项目经历和教育背景等方面出发,给出了编写高质量技术简历所应遵循的…...
重学网络系列之(HTTP的前世今生)
前言文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在叨絮做为一个curd的仔,以前看操作系统,看网络,总觉得是浪费时间,…...

第14讲:代理模式
大家好,我是田哥 本文是MyBatis源码分析系列文章的第14篇,本文内容:代理模式(代理模式、静态代理模式、动态代理模式、策略模式) 代理模式 两个有趣故事 老田买火车票 买火车票已经是很老的话题了。老田以前每年都…...

面试官:策略模式和代理模式有什么区别?
大家好,我是田哥,昨天一哥们面试被问到代理模式,刚好,我也正在写《MyBatis源码分析:小白系列》专栏中的代理模式。这里也说明一下,本文是MyBatis源码分析专栏中的一篇文章。感兴趣的可以扫描了解一下我的《…...

深入理解Netty高性能网络框架
大家好,今天我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架。它的设计异常优雅简洁,扩展性高,稳定性强。拥有非常详细完整的用户文档。同时内置了很多非常有用的模块基本上做到了开箱即用…...

Error-----E: Unable to locate package procps
执行操作:在docker里安装ps命令 报错:E: Unable to locate package procps 解决办法: 先更新软件源,然后再安装 apt-get update...

OpenCV(11)-图像的分割与修复
图像的分割与修复 图像分割的基本概念 图像分割定义:将前景物体从背景中分离出来 图像分割方法: 传统的图像分割方法 分水岭法GrabCut法MeanShift法背景扣除 基于深度学习的图像分割方法 分水岭法 问题:图像存在过多的极小区域而产生许…...

arp同网段一条就能让对方断网攻击命令
arpspoof arp同网段断网攻击只需要一个命令,但是你得知道对方的IP地址和网关地址; 以下就是命令:亲测有效; rootkali:~# arpspoof -i eth0 -t [被攻击者IP地址] [被攻击者网关地址]出现这个效果说明你成功了。...

游戏被攻击了,攻击的人是怎么知道IP的,要如何防护
服务器比作一间房子,IP就相当于地址,游戏在服务器上运行,IP就会对外显示,黑客就可以根据对外运行的业务,找到源IP进行攻击。 针对游戏的攻击,一种是来自同行的恶意竞争,两人运营着相同类型的游戏…...

基于YOLOv4的车辆检测 MATLAB实现
目录 摘要 研究背景 算法设计及实现过程 车辆目标数据集的构建 基于YOLOv4的目标检测 对YOLOv4模型进行改进 实验结果及分析 结论与展望 代码实现 摘要 针对车辆检测,本文提出了一种基于YOLOv4车辆检测算法。制作了一个多天侯、多时段、多场景的车辆目标数…...

软件安全实验——lab10(二、TCP/IP攻击实验)
目录标题1、实验室概况2、实验室环境2.1环撞设置2.2教师须知3、实验室的任务3.1 Task (1): ARP缓存中毒(1)80号工具攻击:(2)33号工具攻击:3.2任务(2):ICMP重定向攻击82,83,84,85,86工具:3.3任务(3):SYN flo…...

虚拟现实资料
给大家推荐一个虚拟现实的资料站http://www.vrage.cn/ 虚拟现实软件http://www.vrage.cn/software/ 虚拟现实硬件http://www.vrage.cn/hardware/ 虚拟现实应用http://www.vrage.cn/solution/ 虚拟现实文献 http://www.vrage.cn/article/...

SpringBoot的filter过滤器
SpringBoot的filter过滤器 目录SpringBoot的filter过滤器一、过滤器的作用和概述1.1 简述1.2 使用场景二、自定义过滤的两种方式2.1 第一种方式2.1.1 启动类增加注解ServletComponentScan2.1.2 定义一个filter类2.1.3. 测试2.2 第二种方式2.2.1 自定义fitler类2.2.4 在启动类中…...

英现绚丽冰墙 犹如魔幻王国纳尼亚(组图)
行人驻足观看这惊艳的冰墙。 冰柱从上面的灌木丛垂直悬挂下来,延伸至结冰的水面,长达15英尺。 由于受北极强冷空气的影响,英国本周末将遭遇13年来最冷的天气,最低温度将会降至零下15摄氏度。但与此同时,低温也为英国人…...
【优雅编程之道】之注释的9点建议
开心一笑 【今天朋友当着我们的面甩一张卡给他媳妇,说随便刷,我们心想他何时变得这么man,只见他媳妇甩起卡就往他脸上扔,说:“有脾气给信用卡,给我什么公交卡”。我们在一旁笑爆了!神回复&…...

纳尼亚魔法王国
前几日去看了这部影片,感觉还是非常不错的,除了童话的味道的稍稍过了点(也许是自已老了吧;) 里面的画面,音乐都非常棒,还有几个主角来着我也还蛮喜欢,两个mm都是雀斑女来着,活活~~ 若乾年前,在牛津大学有两位知名教授,他们私交甚笃,常常一起…...

纳尼亚2:凯斯宾王子片尾曲Regina Spektor - The Call
电影《纳尼亚传奇2:凯斯宾王子》已于6月6日在全国公映。较之第一部,此次剧情十分紧凑,场面宏大,笑料不断,值得一提的是片尾曲《The Call》让人惊艳![1] 歌曲欣赏[2] 影片简介Artsit:Regina Spek…...

登录鉴权中前端验证部分
一 前端部分: 路由验证 应用场景 :例如首页,分类是没有登录的用户也可直接进入 购物车、个人中心等版块需要登录才能进入 实现步骤: …...

JavaScript 学习笔记——基础篇(1) --类型转换、分支循环
一、类型转换 1.typeof (检测数据数据类型) 1.检测类型返回值均为字符串类型; 2.检测不能细分对象类型,普通对象或数组对象都是object类型; 特殊:typeof(null) >object; typeof(Arry[ ]) >object; …...

纯真的年代 暖暖的亲情——我眼中的彼得(电影《纳尼亚传奇》观后感)
声明:我没有看过《纳尼亚传奇》的原著,只是看过电影,这些天正在花痴彼得国王,一时兴起写来抒发一下压抑很久的心情,大家不要见怪呵呵:-)我还不会贴图,这次就不能图文并茂啦:-) 有人说《纳尼亚传奇》是做给儿童看的一部…...

《纳尼亚传奇--狮子、女巫和魔衣柜》
2.《纳尼亚传奇--狮子、女巫和魔衣柜》 听说《纳尼亚传奇》很久了,因为喜欢《魔戒》,所以一直对这部和它并称为魔幻冒险故事的经典的小说很有兴趣。不过因为种种原因,一直没有看实体书。不过这样也好,可以带…...

纳尼亚传奇2观后感
怎么说呢,2也很不错,但是不知怎么回事,就是感觉没有1好看,是我审美观提高了还是没有新鲜感了? “5 minutes.” “no,3” 可爱的缓兵之计~~ 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/1…...

纳尼亚传奇和魔兽世界
<script languagejavascript srchttp://ad.paqiang.com.cn/Header.js></script>前篇写到,我看的那部《纳尼亚传奇》像魔兽世界,上网查了查,发现和我观点一致的人很多唉。于是呢,我就作个分析,让玩过魔兽的…...

纳尼亚传奇2 片尾曲
平静,舒缓烦躁的心灵......[flash400,300]http://www.youtube.com/v/UgC8lPqiYFw&hlja&fs1[/flash]纳尼亚传奇2的片尾曲-The Call It started out as a feeling Which then grew into a hope Which then turned into a quiet thought Which then turned …...

mj评-《纳尼亚传奇3》-8分
儿童片,没有高潮,平铺直叙。缺少动力...

纳尼亚传奇2
在永华看了纳尼亚传奇2(The Chronicles of Narnia : Prince Caspian)。 感觉这一集比第一集有些进步,无论是特效还是故事方面。特效制作据说用的是指环王的原班人马,当然,限于故事的格局,场面还是逊色于指环…...

2015年第7本(英文第6本):纳尼亚传奇I–狮子、女巫、魔衣橱
书名: The Chronicles of Narnia 1 — The Lion, the Witch and the Wardrobe 作者:C.S. Lewis 单词数:4.2万 不重复单词数:3700 首万词不重复单词数:1500 蓝思值:790 阅读时间:2015年4月11日 –…...

那天看了《纳尼亚传奇-狮子女巫衣橱》= 。=
日志标题:那天看了《纳尼亚传奇-狮子女巫衣橱》 。发表时间:2006-8-28 2:53:00早想写点什么……因为都快哭了……片子的整体感觉:引用一个网友的话——场面确实够大,动画人物也很生动,就是配上这种幼稚的剧情确实让人哭…...

《小王子》,《纳尼亚传奇:魔法师的外甥》,《鲁滨逊漂流记》短语合集
《小王子》短语合集 lay aside 把…放在一边 in the course of 在...期间;在什么过程中 a great many 很多 have an encounter with 遇到 matters of consequences 重要的事情 close at hand 近在咫尺 set oneself to attempt 开始尝试/着手于… jumped to…...

The We Company宣布就拟议首次公开募股秘密提交登记声明草案
纽约--(美国商业资讯)--The We Company(以下称“WeWork”)宣布,公司已就其普通股的首次公开募股向美国证券交易委员会(以下称“SEC”)秘密递交了Form S-1登记声明修订草案。WeWork最初于2018年12月向SEC递交了Form S-1…...

外媒:贝恩资本为东芝存储器首次公开募股聘任经办行
【TechWeb】2月21日消息,据国外媒体报道,知情人士称,美国私募股权机构贝恩资本(Bain Capital)已经选中野村和三菱日联摩根士丹利证券经办东芝存储器(Toshiba Memory)的首次公开募股(IPO)。 知情人士称,贝恩资本寻求最早于秋季进行…...

力扣算法篇:IPO(首次公开募股)
题解:每次选最大 超时 class Solution { public:int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {//n个项目中选k个使得资本最大化 每次在w>capital[i]中选择纯利润最大的 int n capital.size();//…...

SPAC Nocturne完成首次公开募股发行,共募集超1亿美元
据雅虎财经4月5日消息,区块链/ 加密资产并购公司SPAC Nocturne Acquisition(代码MBTC)宣布其已完成1亿美元募资,此前已于2021年3月31日正式在纳斯达克上市。其发行单位由一股普通股和一项供股权组成。初始业务合并完成后ÿ…...

The We Company就拟议首次公开募股递交登记声明
纽约--(美国商业资讯)--The We Company今天宣布,该公司就其Class A普通股的首次公开募股向美国证券交易委员会(简称“SEC”)提交了Form S-1登记声明。有关拟议之募股的股票数量和价格范围尚未确定。 摩根大通(J.P. Morgan)、高盛(Goldman Sac…...
中通快递启动香港首次公开募股
中国领先的快递公司中通快递(开曼)有限公司(纽交所股票代码:ZTO)(“公司”或“中通快递”,股份代号:2057.HK)宣布其全球发售之股份(“全球发售”)…...

KCI就拟议首次公开募股递交登记声明
圣安东尼奥--(美国商业资讯)--Acelity今天宣布,其附属公司KCI Holdings, Inc.(简称“KCI”)就KCI普通股的拟议首次公开募股向美国证券交易委员会(简称“SEC”)提交了Form S-1登记声明。在登记声明生效之前,…...

Snowflake就拟议首次公开募股递交登记声明
加州圣马特奥--(美国商业资讯)--云数据平台Snowflake今天宣布,该公司已就其Class A普通股的拟议首次公开募股公开向美国证券交易委员会提交了Form S-1登记声明。拟议募股的股票数量和价格范围尚未确定。Snowflake打算在纽约证券交易所上市交易其Class A普通股&#…...

戴德梁行已提交拟定首次公开发行登记声明
芝加哥---(美国商业资讯)--戴德梁行(Cushman& Wakefield)今日宣布,其已就拟定普通股首次公开发行向美国证券交易委员会(SEC)公开提交S-1表格的登记声明。拟定发行的股份数量和价格范围尚未确定。摩根士丹利、摩根大通、高盛有限责任公司以及瑞银投资银行将担任本…...

CFTC首次公开2019年优先审查权,将以主要加密货币为重心
点击上方“蓝色字”可关注我们!暴走时评:根据2月12日发布的新闻稿,美国监管机构商品期货交易委员会(CFTC)已宣布加密货币将成为今年内部审查的优先事项。其市场监督部(DMO)、掉期交易商及中介监…...

美国房产搜索引擎Trulia寻求首次公开募股(IPO)
据国外媒体报道,美国房产搜索引擎Trulia正在寻求IPO机会。Trulia创始人Pete Flint表示该公司仍然专注于寻求公开募股的机会,但他并没有透露具体的时间。之前Trulia通过风投融资3千万美元,但现在已经对私募不再感兴趣。不久前美国房地产搜索引…...

[Swift]LeetCode502. IPO(首次公开募股) | Initial Public Offerings
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址&a…...

数据集成软件开发商Talend进行首次公开募股
近日,数据集成软件开发商Talend正式递交了IPO相关文件,融资金额为8600万美元。 在2014年2月的一次采访中,Talend的CEO Mike Tuchen曾表示,公司将于“接下来的几年内”上市。 Talend将在纳斯达克进行交易,股票代码为TLN…...

下次首次公开募股可能会出现在区块链上
特拉华州的公司法区块链倡议包括了一种新的“分布式账本股份”,承诺可以降低交易成本,加速自动化手动流程,减少欺诈。公有部门和私有部门都正在拥抱区块链技术(也就是分布式账本技术),数字货币比特币的底层…...

加密货币和股票交易初创公司Robinhood将进行首次公开募股
点击上方“蓝色字”可关注我们!暴走时评:移动投资应用程序Robinhood在今年早些时候推出了零佣金加密货币交易服务,现在正在寻找合适的首席财务官人选,以准备接下来的首次公开募股(IPO)。Robinhood首席执行官…...

CNBC节目主持人Ran Neuner称Coinbase将宣布首次公开募股
点击上方“蓝色字”可关注我们!暴走时评:根据CNBC非洲的Crypto Trader节目主持人Ran Neuner于10月25日发布的一篇推文称,主要的加密货币交易所和钱包Coinbase即将宣布首次公开募股(IPO)。Neuner表示Coinbase首次公开募…...

Opera Limited宣布首次公开募股的定价
挪威OSLO2018年7月27日电 /美通社/ -- 提供创新网络浏览器和人工智能(AI)驱动的内容发现平台Opera News的开拓者Opera Limited(简称“该公司”)今天宣布其首次公开募股(IPO)的定价,该公司共发行9,600,000股美国存托股(简称“ADS”…...

区块链IPO(首次公开募股)
2015年8月17日所处那一周,是糟糕的一周:标准普尔500指数创下四年来最差数据,各地的金融专业都 在谈论世界经济发展的减速,以及潜在的危机。传统的首次公开募股被市场撤出,并购进程因此停滞,硅谷也开始因它们…...

R3计划首次公开募股
点击上方“蓝色字”可关注我们!暴走时评:区块链软件公司R3最近计划推出首次公开募股(IPO)。公司正在与顾问就首次公开募股协商,目前尚未作出最终决定,潜在买家表示很感兴趣。R3一直致力于为更广泛的商业社区…...

Versa Networks在贝莱德领导的首次公开募股前融资中获得1.2亿美元融资,以利用快速增长的SASE市场
贝莱德管理的基金和账户引领了最新一轮股权融资,以支持上市扩张和加速SASE产品创新 Versa Networks是公认的单供应商安全访问服务边缘(SASE)平台领导者,今天宣布获得了1.2亿美元的额外融资。上市前一轮由贝莱德股份有限公司管理的…...

阿里巴巴集团的首次公开募股
阿里巴巴集团的首次公开募股(IPO)已迫在眉睫,预计会在本周晚些时候,潜在的投资者或许想知道,在这宗有望成为美国甚至是全球有史以来最大规模的IPO中,有哪些人在出售股票套现?还有这些股票又来自…...

触宝宣布首次公开募股定价
中国上海2018年9月28日电 /美通社/ -- 触宝(纽约证券交易所股票代码:CTK)(“触宝”或“公司”),一家快速发展的全球移动互联网公司,今日宣布其首次公开上市定价,以每股12.00美元价格…...

首次公开募股
IPO全称Initial public offering( 首次公开募股) 指股份有限公司首次向社会公众公开招股的发行方式。 对应于一级市场,大部分公开发行股票由投资银行集团代销或者包销而进入市场,银行按照一定的折扣价从发行方购买到自己的账户,然…...

Snowflake公布首次公开募股定价
加州圣马特奥--(美国商业资讯)--云数据平台Snowflake今天公布了其2800万股A股普通股首次公开募股的定价,面向公众的价格为每股120.00美元。 其股票预计于2020年9月16日开始在纽约证券交易所交易,股票代码为“SNOW”,发行预计于2020年9月18日交…...

IPO 首次公开募股(Initial Public Offerings,简称IPO)
首次公开募股(Initial Public Offerings,简称IPO):是指一家企业或公司 (股份有限公司)第一次将它的股份向公众出售(首次公开发行,指股份公司首次向社会公众公开招股的发行方式&#…...

茶的生物化学
茶的生物化学 已知 茶叶 中含有500多种化学成分,有机成分有四百五十多种,其中具有生理作用的有很多: 多酚类化合物 茶多酚,也称鞣质, 茶叶 中有含量很高的各类 多酚类化合物 ,从 茶叶 中提取出的多酚类化合…...
Cocos2d-x 3.x 图形学渲染系列二
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社 和《Unity3D…...

茶叶微商怎么引流?微信上如何卖茶叶引流?
我们为什么要选择这茶叶微商呢?那肯定是赚钱,怎么去赚钱呢?那肯定是要想到客户需要什么,也就是市场需求。这里的逆向思维就不再详细的来分析了,今天就直接一步到位的来分析营销推广的逆向思维。 按现在的操作手段,肯定又是什么…...

茶颜、香飘飘相继涨价,“被动内卷”成奶茶业2022年的延续?
“没有什么事是一杯奶茶解决不了的,如果有,那就两杯!”这足以见得奶茶在大众心中的重要位置。如今,全国各地网红奶茶层出不穷,像喜茶、书亦、益禾堂、茶百道、CoCo、蜜雪冰城等各类品牌早已遍布大街小巷。 不能否认&a…...
沉香茶中极品-海南沉香茶
沉香茶因为特有的美容养颜、瘦身减脂、安神助眠、提高免疫力、防三高等保健功效,越来越受到爱美人士,懂生活、有品位人士的喜爱,那么全国各处的沉香茶,以哪个地方的为最佳呢?下面小编来给大家普及下。 沉香茶是什么茶&…...

云南普洱熟茶的起源!
说起云南人工渥堆发酵的普洱茶,也就是人们常说的普洱熟茶,茶友们总是会想,它到底创制于什么时候呢,是何人所创的呢?有些会说,是1973年,有人会说是1975年,首创人的名字也会出现一大堆…...

信阳毛尖大山茶、高山茶、小山茶的辨别
绿茶信阳毛尖得到大家认可后,但关于信阳毛尖大山茶和高山茶与小山茶的辨别估计很少外地人能分得明白,下面就信阳毛尖大山茶和高山茶与小山茶的辨别说明下。 信阳毛尖亩产量非常低,高山茶一亩每年6斤左右,大山茶一亩每年约15斤左右…...

机器人阻抗控制(二)
#阻抗控制 #机器人控制 #动力学方程 《Cartesian Impedance Control of Redundant and Flexible-Joint Robots》 One of the core statements of the impedance control methodology is that the controller should modulate the mechanical impedance4 of the manipulator. 具…...

Python基础(十九):数学相关模块
简介Python 中数学相关模块,如下所示:模块描述math提供了对 C 标准定义的数学函数的访问(不适用于复数)cmath提供了一些关于复数的数学函数decimal为快速正确舍入的十进制浮点运算提供支持fractions为分数运算提供支持random实现各…...

5W2H理解数据埋点
本文将从产品运营、数据产品经理的角度,并采用5W2H分析法向各位介绍埋点的相关知识。 一、什么是数据埋点?(What) 1、概述 数据埋点是数据采集领域(尤其是用户行为数据采集领域)的术语,指的是…...

21考虑用户舒适度的冷热电多能互补综合能源系统优化调度
说明书 MATLAB代码:考虑用户舒适度的冷热电多能互补综合能源系统优化调度 关键词:用户舒适度 综合能源 PMV 优化调度 参考文档:《冷热电气多能互补的微能源网鲁棒优化调度》基础模型加舒适度部分模型; 仿真平台:MA…...

【Element】el-select下拉选择器搜索选项,自定义搜索方法,结合后端接口远程搜索
el-select搜索选项 当我们有多个选项时,我们一般会使用下拉选择器el-select展示选项,选项不多的情况下,我们可以进行手动下拉选择。那当选项有100个,甚至1000个的时候,需要一个个找选项,手动下拉选择就太累…...

leetcode-链表-2.两数相加
2. 两数相加 - 力扣(Leetcode) class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if (l1null&&l2null){return null;}if (l1null){l1new ListNode(0);}if (l2null){l2new ListNode(0);}int suml1.vall2.val;if (sum&g…...

一句话设计模式9:装饰器模式
装饰器模式:低级AOP落地实现。 文章目录装饰器模式:低级AOP落地实现。前言一、装饰器模式的作用二、如何实现装饰器模式总结前言 装饰器模式一般使用场景是: 对已有功能代码想做增强,而不是修改原有功能或者代码; 一、装饰器模式的作用 1 完美符合开闭原则,对于原代码无任何改…...

3Dmax开孔打洞圆孔洞的几种方法和技巧
最常见的几种打洞方法及技巧和注意事项总结如下。除了布尔运算外其余几种都是在可编辑多边形模式下进行的,这里所有的打孔打洞都是以圆洞为例,因为圆洞的难度相对来说要大一些了。 文章目录一、布尔二、投射三、推拉1、推送到对面2、效果演示四、点切角五…...

重构数据-Encapsulate Collection封装集合十
重构数据-Encapsulate Collection封装集合十 1.封装集合 1.1.使用场景 有个函数返回一个集合。让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数。 我们常常会在一个类中使用集合(collection,可能是array、l…...

Linux--IP协议--0316-19
目录 1. IP协议 1.1 协议头格式 1.1.1 报头内容的详细理解 1.2 分片 分片是什么? 如何做到分片? 1.2.1 关于分片的认识 1.2.2 分片的具体过程 1.2.3 分片的坏处 1.3网段划分 1.3.1 CIDR (网络掩码)划分 1. IP协议 概念…...
Git 入门最佳实践
Git 入门最佳实践 前言 Git简介 实用主义 深入探索 总结 参考资料 前言 Git 是程序员学习和工作都离不开发工具,今天和大家分享 Git 常用命令总结。 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优…...

蓝桥杯算法基础_猜年龄_课程笔记
题目 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说: “我年龄的立方是个4位数。我年龄…...

机器学习:L2正则项(权重衰减)和梯度的理解
正则化方法:L2正则化 正则化定义:凡是可以减少泛化误差而不是减少训练误差的方法,都可以称作正则化方法 我们其实不用去管什么是泛化误差、什么是训练误差,只需“凡是能减少过拟合的方法都是正则化方法” 正则化方法࿱…...

学AutoSAR,敢不知道.arxml?
什么是.arxml文件? 如果用一句话来给.arxml下个定义的话,我会说: .arxml是一种交互文件,一种用于AtutoSAR工具链各工具之间沟通的桥梁。 这种文件里都有什么? 不同的工具输出不同的.arxml文件,简单分个层…...

SkyWalking+ElasticSearch7实现日志追踪
文章目录1.安装ElasticSearch7下载ElasticSearch71.1 解压 elasticsearch-7.8.01.2 进入elasticsearch-7.8.01.3 ES配置文件1.4 创建es用户查看elasticsearch 状态2 安装 SkyWalking2.1 下载 SkyWalking8.1-es版本2.2 解压2.3 修改配置文件2.4 修改skywalking-ui 端口2.5启动2.…...

KeepAlived + Nginx 高可用
KeepAlived Nginx 高可用 主机系统VIPIP主Master01Ubuntu 22.04192.168.79.155192.168.79.177是Worker01Ubuntu 22.04192.168.79.155192.168.79.180否Worker02Ubuntu 22.04192.168.79.155192.168.79.181否 Master01 设置hostname $ cat /etc/hosts 127.0.0.1 localhost 127…...

对于浏览器内核的理解
浏览器内核简介主流浏览器所使用的内核分类组成部分总结简介 经常听说各种不同的浏览器,IE、Opera、Firefox、Safari、The World还有现在的Chrome等。看似许多不同的浏览器,其实其中还是有很多相似之处。今天,我们就来了解他们的内核~&#…...

GO select,switch, for 语句的注意事项
1、select 可以包含写入Channel select { case ch <- 1: } 写入也只是判断一种case成功,不会循环写入多条。 2、 如果没有default ,也没有符合条件的,则会锁死 3、break 不能跳出for select 语句,需要借助Label,或者goto …...

【C语言】3天速刷C语言(指针进阶)
字符指针在指针类型中我们知道有一种指针类型为字符指针char*;一般使用:int main() {char ch w;char *pc &ch;*pc w;return 0; }还有一种使用方式:int main() {char* pstr "hello bit.";//这里是把一个字符串放到pstr指针变…...

系统测试与维护
一、系统测试 测试的目标:测试是为了发现错误而执行程序的过程测试的原则:尽早并不断的进行测试程序员避免测试自己自己设计的程序;测试工作应避免由原开发软件的人或小组来承担(单元测试除外)不仅要包括合理、有效的…...

Windows下VS2019配置OpenVINO2022.3
VS2019配置OpenVINO2022.3 本文在在Windows中基于Visual Studio配置OpenVINO C开发环境 基础上进行更改最新版的openvino引用目录较多,文中将给出详细参考 本文主要介绍在Windows中基于Visual Studio配置OpenVINO C开发环境,主要步骤有: 下…...

华为OD机试用Python实现 -【补种未成活胡杨树】
华为OD机试题 本篇题目:补种未成活胡杨树题目输入描述输出描述:示例 1输入输出说明编码 Code Python 补种未成活胡杨树最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析…...

Vector - CAPL - RS232串口处理
摸鱼聊天、答疑解惑首选之地 --- 车载网络哪些事儿你是否还在为VT板卡系统昂贵而发愁?是否为MCU log没办法而烦恼?当前车载网络协议测试这块,vector可以说是一家独大,因此各种骚操作一年比一年多,然而对于我们测试工程…...

腾讯云CloudPages建站模板搭建网站教程
腾讯云建站CloudPages自助建站模板,建站神奇不需要会代码小白轻松搭建网站,CloudPages支持海量精美建站模板,可用于搭建企业官网、广告落地页、微信小程序等,支持PC、H5、小程序三端自适应,像做PPT一样自助搭建网站&am…...

【web开发网页制作】Html+Css网页制作关于我的家乡(6页面)【附源码下载】
【写在前面】之前学生时代自己也做了不少页面,现在毕业后也希望能慢慢的分享出来给大家,希望能给刚接触web开发的你带来一些启发。其实关于网页制作,没有大家想象中的那么难,接下来给大家详细介绍一下如何实现网页的制作ÿ…...

大数据之Hive SQL题库-初级
第一章环境准备1.1 建表语句hive>-- 创建学生表 DROP TABLE IF EXISTS student; create table if not exists student_info(stu_id string COMMENT 学生id,stu_name string COMMENT 学生姓名,birthday string COMMENT 出生日期,sex string COMMENT 性别 ) row format delim…...

百元蓝牙降噪耳机哪个比较好?平价不踩雷的降噪蓝牙耳机评测
目前最流行热门的3C数码好物,必然是降噪蓝牙耳机!在大街上、公交和地铁上都可以看到很多用户都佩戴着蓝牙耳机,并且具有降噪功能的蓝牙耳机更受欢迎。下面我来分享几款平价又不踩雷的降噪蓝牙耳机给大家,希望大家都能找到心仪那…...

Win11的两个实用技巧系列之电脑磁盘分区的方法、任务栏点击网络声音图标无反应怎么办
Win11怎么把C盘分成几个盘?Win11电脑磁盘分区的方法近期有用户刚给电脑安装了新的Win11系统,在后续的使用中,发现电脑磁盘只有一个C盘,需要分盘,如何分呢?本文就为大家带来了详细的分盘教程,需要的朋友一起看看吧Win1…...

如何基于Security框架兼容多套用户密码加密方式
一、说明 当已上线的系统存在使用其他的加密方式加密的密码数据,并且密码 不可逆 时,而新的数据采用了其他的加密方式,则需要同时兼容多种加密方式的密码校验。 例如下列几种情况: 旧系统用户的密码采用了 MD5 的加密方式&…...

python:数据结构内容(1)
文章目录壹、元组定义1、创建元组2、访问元组中数据3、元组的连接4、删除元组5、常用的元组函数贰、列表定义1、创建列表2、访问列表3、列表赋值4、删除元素5、列表中的操作方法引言:为了在计算机程序中表示现实世界中更加复杂的数据,python除了提供数字…...

Lazada各大跨境站点,lazada商品详情 API 返回值说明
item_get-lazada商品详情 公共参数 名称类型必须描述keyString是 调用key(必须以GET方式拼接在URL中) 注册Key和secret测试 secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_s…...

【iOS】—— ARC学习
ARC 文章目录ARC内存管理的思考方式自己生成的对象自己持有非自己生成的对象,自己也能持有不再需要自己持有的对象时释放无法释放非自己持有的对象所有权修饰符在什么时候会用到weak和strong?__unsafe_unretained__autoreleasing__autoreleasing的应用场…...

onethink 字段插件 多图上传 UploadImages
多图上传插件,先上效果图该插件和之前的一个UploadImages 插件命名一样只不过功能不一样,所以不能同时使用,如果知道怎么改插件那就当我上面没说哈。功能列表:多图上传,删除,拖拽排序,自定义增加字段添加扩…...

东风最高降9万,一场卖车焦虑背后的“定价权”争夺
文|智能相对论作者|leo陈3月,“东风系”汽车湖北大降价,猛地刺激了消费者和同行。“门店里东风雪铁龙车型全部爆单,没有办法再接新订单,因为没有车交,其他车型倒是还有少量现车。”湖北某家东风门店的销售这样说&#…...

RabbitMQ学习(一)中间件技术、消息队列协议、持久化、分发策略、高可用与高可靠、入门与安装、角色分类
中间件技术与分布式架构 分布式中间件 消息中间件 类型:ActiveMQ、RabbitMQ、Kafka、RocketMQ 场景:消息中间件监控数据 、异步数据传输场景、流量削峰、任务调度、海量数据同步、分布式事务、日志管理、大数据分析与传递、数据的分发与异步处理 协议…...

GBase 8c GDCA培训认证【环境准备、安装】
1. 环境准备 相关配置要求如下: 配置:内存16G以上(最好16G),硬盘 20G以上,固定IP地址和mac地址;镜像包(Centos7.9)下载,root 账户密码6个1:11111…...

java总结--线程
什么是线程、什么是进程 进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。 线程是进程…...

计算机网络中---重要相似基础的概念
目录 TCP和UDPhttp和https网段和网关端到端和点到点流量控制和拥塞控制单工、半双工和全双工虚电路服务和数据报服务CSMA / CD和CSMA / CA电路交换、报文、分组交换频分复用、时分、波分、码分复用TCP和UDP 这是传输层为了支持不断增多的应用层协议而提供的两种协议,主要是为…...

神经网络之反向传播算法(自适应学习率调整算法Adadelta)
文章目录自适应学习率调整算法(Adadelta)1、算法原理2、算法实现2.1 训练过程2.2 测试过程及结果3、参考源码及数据集自适应学习率调整算法(Adadelta) 自适应学习率调整算法(Adadelta)可以视作是自适应梯度…...

使用TensorFlow Serving进行模型的部署和客户端推理
目的:在一个server端使用TensorFlow框架对模型进行训练和保存模型文件后用TensorFlow Serving进行部署,使得能在客户端上传输入数据后得到server端返回的结果,实现远程调用的效果。环境:操作系统: ubuntu 20.04.1当然可…...

Android异步消息机制
一、异步消息处理机制Handler Android中的异步消息处理主要由4个部分组成:Message、Handler、MessageQueue和Looper。 Message Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间传递数据。如Message的what字段…...

【id:10】【20分】B. 三串合一(指针与字符数组)
题目描述 输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串 要求: 1. 三个字符串的创建和输入可以使用数组,也可以不用 2. 输入后,根…...

GoJS 2.3 Crack
GoJS 2.3 新的 SVG 渲染上下文 GoJS 通常将图渲染到 HTML 画布,并提供将图场景导出到 图像格式和 SVG。在 GoJS 2.3 中,该库现在支持在 添加到默认画布上下文中。视觉上应该没有变化,性能会 使用默认画布上下文时速度更快,但 SVG…...

数据结构 -- 线性表:定长顺序表和不定长顺序表的代码和实现
一、顺序表 概念: 是一种线性结构(1对1的关系),每一个数据元素都有一个前驱(除了第一个元素)和一个后继(除了最后一个元素) 在逻辑上数据元素都是连续的,在物理存储上数…...

面试了8家软件公司测试岗位,面试题大盘点,我真的尽力了
包含的模块:本文分为十九个模块,分别是:软件测试 基础、liunx、MySQL、web测试、接口测试、APP测试 、管理工具、Python、性能测试、selenium、lordrunner、计算机网络、组成原理、数据结构与算法、逻辑题、人力资源需要的可以看文末获取方式…...

JavaScript专题之惰性函数
参考原文:JavaScript专题之惰性函数 需求 我们现在需要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。 解决一:普通方法 var t; function foo() {if (t) return t;t new Date()return t; }问题有两个&…...

Android本地关键代码安全处理
一、背景 最近在做代码安全方面的工作,发现一些关键信息如:密钥、加密策略等直接写死在项目代码中,存在代码安全隐患。本文档提供一种示例:把关键信息,保存在native层;并对安装包关联信息进行校验…...

Phoenix简介_安装部署_以及连接使用---大数据之Hbase工作笔记0035
我们之前都是用hbase的api的jar包来执行操作的hbase,但是不方便因为语法,太复杂了,提供的api也很麻烦,操作很不友好,Phoenix是凤凰的意思,可以让操作像mysql一样简单,写就可以了 可以看到Phoenix的介绍 上面是官网可以看下 然后看一下如何安装,可以看...

2020-复习
2020-复习一、程序设计二、操作系统三、计算机网络一、程序设计 1.编写一个函数实现十进制向二进制转换的功能,函数的输入为一个十进制数,输出为一个二进制数,如输入37,输出为100101 #include <stdio.h> // 编写一个函数实现十进制向二进制转换的功能,函数的输入为一个…...

Vue2项目总结-电商后台管理系统
Vue2项目总结-电商后台管理系统 去年做的项目,拖了很久,总算是打起精力去做这个项目的总结,并对Vue2的相关知识进行回顾与复习 各个功能模块如果有过多重复冗杂的部分,将会抽取部分值得记录复习的地方进行记录 一:项目…...

M1/M2 Pro VMware Fusion虚拟机安装Win11教程(超详细)
前言 最近换了新电脑 —— M2 Pro,属于是结束了二十多年的Windows生涯了。但是有些东西又必须在Windows系统上去搞。 比如 易语言开发、运行一些exe的软件等等,没办法,搞个虚拟机,装个Win11吧。 下面进入正题: 一、安装…...

记一次Excel模板导出功能
前言 这篇文章是要记载在开发过程中实现:使用自己定义的excel模板文件,将list数据填入模板文件中。 说明 这里只记录了一些功能要点和使用时要注意的地方!!! 详细 引入依赖 这里使用的是easypoi来实现这个功能,先引入依赖包,版本是4.1.2<dependency><group…...

Internet基础
目录Internet1、MAC地址2、IP地址(1)IP地址定义(2)IP地址分类(3)IP地址组成(4)IP地址的计算①子网数,主机数的计算②网络地址和广播地址的计算3、DNS和URL(1&…...

day11-函数总结
Function Effect 在实现某个功能对应的代码的时候,如果将实现功能对应的函数放到函数中,那么下一次再需要这个功能的时候,就可以不用再写这个功能对应的代码了,而是直接调用这个功能对应的函数 def sum_range(num):sum1 0for x…...

python中dumps、dump、load、loads的区别
根据序列化和反序列的特性 loads: 是将string转换为dictdumps: 是将dict转换为stringload: 是将里json格式字符串转化为dict,读取文件dump: 是将dict类型转换为json格式字符串,存入文件 一、相同点 dump…...

CSS基础之盒模型
盒模型 简介 在CSS中,元素都是被一个个的盒子(box)包围着,理解这些盒子的基本原理,是我们使用CSS实现准确布局,处理元素排列的关键。在CSS中有 块级盒子、内联盒子 两种,它们在页面流和元素…...

2023系统分析师---项目管理
一、项目管理 一、基本概念 范围管理:确定项目的边界,即那些工作是项目应该做的,那些工作不应该包括在项目中范围定义的输入包括:项目章程、项目范围管理计划、批准的变更申请、组织过程资产WBS的作用包括:便于估算、…...

go-zero学习 — 基础
go-zero学习 — 基础1 参考2 goctl 相关命令整理2.1 .api生成swagger的命令2.2 .api生成api模块的命令2.3 .proto生成rpc模块的命令2.4 sql文件生成model的命令2.5 docker启动swagger的命令3 架构图4 go-zero环境搭建4.1 注意事项4.2 go-zero 需要安装的组件4.3 方式 14.4 方式…...

【算法】退火算法+背包问题 python
目录一、概念二、算法的优点三、基本流程和公式四、例题python代码已知背包的装载量为 c10,现有 n5 个物品,它们的重量和价值分别是 (2, 3, 5, 1, 4) 和 (2, 5, 8, 3, 6)。试使用模拟退火算法求解该背包问题。python 代码一、概念 模拟退火算法采用类似…...

算法高频函数
目录 fixed() setprecision() setw() swap() sort() subsrt() atoi() 将不定时更新 fixed() 消除浮点数的科学计数法 只要出现了fixed,则后面都是以fixed输出。 用定点表示法表示浮点…...