n元一维向量向左循环移位i的几种算法
1、最简单的算法借助于一个n元的中间向量在n步时间内完成
时间复杂度:O(n) 空间复杂度O(n)
void shift_easy(int arr[], int _arr[], int n, int i){
int j = ;
while(i < n){
_arr[j++] = arr[i++];
}
i = ;
while(j < n){
_arr[j++] = arr[i++];
}
}
2、使用翻转的思路完成一个不需要额外空间、编写简单并且实际运行很快的算法
时间复杂度:O(n)
void swap(int arr[], int i, int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void reverse_shift(int arr[], int n, int i){
int j , k;
j = ;
while(j < (i - j - )){
swap(arr, j, i- j- );
j++;
}
j = i;
k = ;
while(j < (n - k - )){
swap(arr, j, n - k -);
j++;
k++;
}
j=;
while(j < (n - j - )){
swap(arr, j, n - j -);
j++;
}
}
3、在O(n)时间内完成、不需要额外空间的杂技算法
原理是:将x[0]移动到t,将x[i]移动到x[0],将x[2i]移动到x[i](将x的下标对n取模),直到返回取x[0]中的元素,此时改为从t取值并停止过程。如果该过程没有移动全部元素,就从x[1]开始再次移动,直到所有的元素都移动为止。
int gcd(int a, int b){
int temp;
if(b == )
return a;
do{
temp = a % b;
a = b;
b = temp;
}while(b != );
return a;
}
void acrob_shift(int arr[], int n, int rotdist){
int j, k, i, temp;
for(i = ; i < gcd(rotdist, n); i++){
temp = arr[i];
j = i;
while(){
k = j + rotdist;
if(k >= n)
k -= n;
if(k == i)
break;
arr[j] = arr[k];
j = k;
}
arr[j] = temp;
}
}
4、块交换算法(效率最高)
void swap_block(int arr[], int sp1, int sp2, int s){
int temp;
while(s > ){
temp = arr[sp1 + s -];
arr[sp1 + s - ] = arr[sp2 + s - ];
arr[sp2 + s - ] = temp;
s--;
}
}
void block_shift(int arr[], int n, int rotdist){
int i, j, p;
if(rotdist == || rotdist == n)
return;
i = p = rotdist;
j = n - p;
while(i != j){
if(i > j){
swap_block(arr, p-i, p, j);
i -= j;
}
else{
swap_block(arr, p-i, p+j-i, i);
j -= i;
}
}
swap_block(arr, p-i, p, i);
}
n元一维向量向左循环移位i的几种算法的更多相关文章
- n维向量旋转(循环移位)——学习《编程珠玑》
问题: 将一个n元一维向量向左旋转i个位置.例如,当n=8且i=3时,向量abcdefgh旋转为defghabc. 简单的代码使用一个n元的中间向量在n步内完成该工作. 你能否仅使用数十个额外字节的存 ...
- TensorFlow.js入门(一)一维向量的学习
TensorFlow的介绍 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着 ...
- TensorFlow.js入门:一维向量的学习
转载自:https://blog.csdn.net/weixin_34061042/article/details/89700664 一维向量及其运算 tensor 是 TensorFlow.js 的 ...
- matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)
MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...
- sql 三表左外链接的2种写法【原】
初始化语句 DROP TABLE student; ) )); ','bobo'); ','sisi'); ','gugu'); ','mimi'); DROP TABLE room; ) ),roo ...
- 左神算法进阶班1_5BFPRT算法
在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...
- c# 一维数组和二维数组的几种定义方式<转>
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- 写出Python中列表、元祖、字典、字符串的至少5种以上的方法
1.列表 常用方法 作用 参数 append(data) 在尾部添加数据 data-加入到列表中的数据 insert(idx,data) 在指定位置添加数据 idx-索引 data-数据 ext ...
- python 版 mldivide matlab 反除(左除)《数学建模算法与程序》Python笔记
今天在阅读数学建模的时候看到了差分那章 其中有一个用matlab求线性的代码,这里我贴出来 这里我送上 Python代码 In [39]: import numpy as np ...: from s ...
随机推荐
- 树莓派安装SimpleCV
开源计算机视觉框架.python2 安装 (http://simplecv.readthedocs.io/en/latest/HOWTO-Install%20on%20RaspberryPi.html ...
- java->php之在线子域名查询-接口光速版
因为不懂java,所以 用php重写了大佬的 在线子域名查询-接口光速版 http://sbd.ximcx.cn/ 这是大佬的 然后 改一下 ,用php 其实就是改了几行代码而已,jquery和aj ...
- PTA(BasicLevel)-1008数组元素循环右移问题
一 .问题描述 原题描述 将长度为n的整形数组A进行右移m位操作, [A0 A1 A2 A3 ... Am...An-1]变为[An-m...An-1 A0 A1 A2 A3 ...An-m ...
- Dart 语言了解
Dart 语言了解 概念 当您了解Dart语言时,请记住以下事实和概念: 您可以放在变量中的所有内容都是一个对象,每个对象都是一个类的实例.偶数,函数和 null对象.所有对象都从Object类继承. ...
- sed: unix与doc换行的转换
在Linux (Unix)平台下回车换行以\n表示 在Window平台下回车换行以\r\n表示 两者的差异导致了: 在window下看Linux的文本排版全乱 在Linux在看Window的文本则是存 ...
- day5 二值化
1.otsu二值化 # coding=utf-8 import cv2 import numpy as np from matplotlib import pyplot as plt #1.读入图像 ...
- MSP-EZ430U_02板子测试使用
1. 实物如下 2. 先上电,显示驱动没安装 3. 找到驱动的位置,不过实际上安装IAR for msp430之后,驱动就自动的识别了.
- 探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持
在ASP.NET MVC3中(从那时开始),我们拥有了对js和css等文件的捆绑(Bundling)和压缩(Minification)的能力,这是ASP.NET性能优化工作的一部分. 想一下很久以前, ...
- Intellif IDEA 自带数据库管理工具 DataBase 配置
第一步: 第二步: 第三步: jdbc:oracle:thin:@192.168.19.39:1521:orcl
- WebAPI学习笔记
WebAPI WebApi是添加到Asp.Net平台的一个新特性,可以快速的创建Web服务,并对客户端提供HTTP的API调用接口 WebApi是建立在MVC框架基础之上,但不属于MVC的一部分. 序 ...