【物理排序】(最小交换环 | 大体量表排序 | 泛型算法)

设想一下,如果待排元素不是一个简单的整数,而是一个庞大的结构体,移动元素的时间不能忽略不计

元素需要频繁互换,那么移动这些元素的时间将会非常长久,效率很低

typedef very_large_item {int comparable;Tp very_large_data;
} very_large_item_collection[Nm] {};


 

间接排序:定义一个指针数组作为“表”(table)。

在表排序的过程中,实际上是不需要移动那些原始数据的,要移动的只是指向他们位置的那些指针。

不移动元素本身,而只移动元素本身的排序方法,我们称之为“间接排序”。



 

对target结构体数组进行表排序:

std::array<int, __MAX__> indices {};
std::iota(indices.begin(), indices.begin() + distance, 0);
std::sort(indices.begin(), indices.begin() + distance,
[&](auto&& i, auto&& j){return binary_cmptor(target[i], target[j]);
});for(int i {}; i < distance; ++i) visit(target[indices[i]]);


 

交换环:N个数字的排列由若干个独立的环组成。 

        

        在排序过程中,可能需要在不同的计算节点之间交换数据,以便进行合并或比较操作。交换环提供了一种机制,使得数据可以在节点之间以循环的方式传递,从而实现高效的通信



 

#include <array>
#include <algorithm>
#include <functional>
#include <numeric>
#include <iterator>
#include <concepts>
#include <random>
#include <iostream>constexpr auto __MAX__ { static_cast<int>(1e3) };template <typename RandomIt, typename Compare = std::less<>>
void physical_sort(RandomIt first, RandomIt last, Compare comp) {using value_type = typename std::iterator_traits<RandomIt>::value_type;
/*
*   	static_assert(std::is_default_constructible<value_type>::value
*		&& 			  std::assignable_from<value_type, value_type &&>);
*
*       statements above is not neccessary:
* 		all declared whereat std::sort requirements and static assertions.
*/auto distance { static_cast<int>(std::distance(first, last)) };std::array<int, __MAX__> indices {};std::iota(indices.begin(), indices.begin() + distance, 0);std::sort(indices.begin(), indices.begin() + distance,[&](auto&& i, auto&& j){return comp(*(first + i), *(first + j));});for(int i {}; i < distance; ++i) {if(indices[i] == i) continue;value_type temporary {};(void) std::exchange(temporary, std::move(*(first + i)));int j { i }, previous {};while(! (indices[j] == j)) {previous = j;(void) std::exchange(*(first + j),std::move(*(first + indices[j])));std::swap(j, indices[j]);}(void) std::exchange(*(first + previous), std::move(temporary));}
}template <typename RandomIt>
void physical_sort(RandomIt first, RandomIt last) {physical_sort<RandomIt, std::less<>>(first, last, std::less<>());
}constexpr int N { 10 };
struct big_item{int key;int dummy_array[32U] {};bool operator<(const big_item& other) const & noexcept{ return key < other.key; }
} big_items[N];int main(void) {std::random_device dev;std::mt19937 gen(dev()); std::uniform_int_distribution<> distrib(0, N);std::generate(std::begin(big_items), std::end(big_items),[&]{return big_item { key: distrib(gen) };});std::puts("before");for(int i {}; i < N; ++i) std::cout << big_items[i].key << ' ';endl(std::cout);physical_sort(std::begin(big_items), std::end(big_items));std::puts("after");for(int i {}; i < N; ++i) std::cout << big_items[i].key << ' ';endl(std::cout);
}


 

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

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

相关文章

vue选项式API和组合式API区别-备忘

Vue.js 的选项式API和组合式API是两种不同的编写Vue组件的方式&#xff0c;它们各自有不同的特点和适用场景&#xff1a; 选项式API (Options API) 这是 Vue.js 最初的API设计方式&#xff0c;也是最为广泛使用的编程模型。在选项式API中&#xff0c;一个Vue组件由一系列可选…

【MySQL | 第四篇】区分SQL语句的书写和执行顺序

文章目录 4.区分SQL语句的书写和执行顺序4.1书写顺序4.2执行顺序4.3总结4.4扩充&#xff1a;辨别having与where的异同&#xff1f;4.5聚合查询 4.区分SQL语句的书写和执行顺序 注意&#xff1a;SQL 语句的书写顺序与执行顺序不是一致的 4.1书写顺序 SELECT <字段名> …

点赞功能真的有必要上 Redis 吗?(Mongo、MySQL、Redis、MQ 实测性能对比)

目录 一、你会怎么设计一个点赞功能&#xff1f; 1.1、点赞实现思路 1.2、点赞功能设计 1.2.1、MySQL 单表 1.2.2、单表 MySQL 关联表 1.2.3、MySQL 关联表 mq 1.2.4、redis mq 1.2.5、mongodb 关联文档 二、性能测试 2.1、前置说明 2.2、10 万数据准备 一、你会…

kubectl基础命令详解

管理名称空间资源 查看名称空间 [rootceshi-130 conf]# kubectl get ns [rootceshi-130 conf]# kubectl get namespace NAME STATUS AGE default Active 7d17h kube-node-lease Active 7d17h kube-public Active 7d17h kube-system …

【C++】三大特性之继承

1 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展、增加功能&#xff0c;这样产生新的类&#xff0c;称派生类&#xff08;或子类&#xff09;。而被继承的…

Java宝典-抽象类和接口

目录 1. 抽象类1.1 抽象类的概念1.2 抽象类的语法1.3 抽象类的特点 2. 接口2.1 接口的概念2.2 接口的语法2.3 接口的特点2.4 实现多个接口2.5 接口的继承 3. 接口使用案例 铁汁们好,今天我们学习抽象类和接口~ 1. 抽象类 1.1 抽象类的概念 什么是抽象类?在面向对象中,如果一…

FIT介绍-1

1、编译 FIT image 文件的编译过程很简单&#xff0c;根据实际情况&#xff0c;编写image source file之后&#xff08;假设名称为u-boot.its&#xff09;&#xff0c;在命令行使用mkimage工具编译即可&#xff1a; ./tools/mkimage [-D dtc_options] [-f fit-image.its|-f a…

OpenFeign的学习总结

1.Fegin调用只有在微服务之间才会使用&#xff0c;以前的单体项目用不到&#xff0c;因为单体项目不会涉及到分库的概念&#xff0c;并且单体项目就一个应用&#xff0c;想用的功能都可以直接方法调用&#xff0c;但是微服务就不行&#xff0c;跨服务的调用只能通过http的操作&…

Google浏览器122.下载驱动

打开网址&#xff1a;Chrome for Testing availability (googlechromelabs.github.io) 选择stable 选择对应的驱动就行

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 14 天啦&#xff01;学习了 flink 高级特性和新特性之数据类型及 avro 序列化&#xff0c;主要是解决大数据领域数据规范化写入和规范化读取的问题&#xff0c;avro 数据结构可以节约存储空间&#xff0c;本文中结合企业真…

JVM运行时数据区概述以及分别存放的内容

JVM的运行时数据区是JVM在执行Java程序时用于存储数据和状态信息的内存区域。它分为多个部分&#xff0c;每个部分都有其特定的作用和存放的内容。 1. 方法区&#xff08;Method Area&#xff09; 作用&#xff1a;方法区是所有线程共享的内存区域&#xff0c;用于存放已被虚…

Java面试题总结9:mybatis

mybatis的优缺点 优点&#xff1a; 基于SQL语句编程&#xff0c;不会对应用程序或者数据库的现有设计造成任何影响&#xff0c;SQL写在XML里&#xff0c;解除sql与程序代码的耦合&#xff0c;便于统一管理&#xff0c;提供XML标签&#xff0c;支持编写动态SQL语句&#xff0c…

开源向量数据库介绍

在开源矢量数据库的世界里&#xff0c;有些名字因其性能、灵活性和健壮性而脱颖而出。 1. Milvus Milvus 由 Zilliz 推出&#xff0c;是一款高度可定制的开源矢量数据库&#xff0c;在处理大规模数据方面大放异彩。由于其出色的可扩展性&#xff0c;当你需要处理大量数据时&a…

判断链表回文

题目&#xff1a; //方法一&#xff0c;空间复杂度O(n) class Solution { public:bool isPalindrome(ListNode* head) {vector<int> nums; //放进数组后用双指针判断ListNode* cur head;while(cur){nums.emplace_back(cur->val);cur cur->next;}for(int i0…

如何在非spring环境中调用service中的方法

什么是非spring环境 非Spring环境指的是不使用Spring框架来管理和配置应用程序的运行时环境。在Spring框架中&#xff0c;开发者可以利用依赖注入、面向切面编程&#xff08;AOP&#xff09;、事务管理、安全性、数据访问等特性来简化企业级应用程序的开发。当应用程序不依赖于…

力扣同类题:重排链表

很明显做过一次 class Solution { public:void reorderList(ListNode* head) {if(!head||!head->next)return;ListNode *fasthead,*lowhead;ListNode *prenullptr,*curnullptr,*nextnullptr;while(fast->next!nullptr){fastfast->next;if(fast->next)fastfast->…

深入理解操作系统Operator System(2)

目录 操作系统对上的管理 系统调用接口 用户操作接口&#xff08;库函数&#xff09; 系统调用和库函数的概念 结构层次示意图 总结 为什么要有操作系统❓ 上次主要介绍了操作系统的"管理"和操作系统对下的管理。本篇主要是对上的管理。 操作系统对上的管理 …

04-ESP32S3-GPIO

ESP32S3-IDF GPIO GPIO简介 ESP32S3提供了多达45个物理GPIO管脚&#xff0c;这些管脚不仅可以作为通用的输入输出接口&#xff0c;还可以连接到内部外设信号。通过GPIO交换矩阵、IO MUX和RTC IO MUX&#xff0c;可以灵活地配置外设模块的输入信号来源于任何GPIO管脚&#xff0…

k8s存储

目录 前瞻 emptyDir存储卷 hostPath存储卷 nfs共享存储卷 PVC 和 PV NFS使用PV和PVC 配置nfs存储 定义PV 定义PVC 测试访问 搭建 StorageClass nfs-client-provisioner &#xff0c;实现 NFS 的动态 PV 创建 在192.168.75.40节点上安装nfs&#xff0c;并配置nfs服务 …

python:标准正态同质性检验(Standard Normal Homogeneity Test,SNHT) 突变点检测(以NDVI时间序列为例)

作者:CSDN @ _养乐多_ 本文将介绍标准正态同质性检验(Standard Normal Homogeneity Test,SNHT) 突变点检测代码。以 NDVI 时间序列为例。输入数据可以是csv,一列NDVI值,一列时间。代码可以扩展到遥感时间序列突变检测(突变年份、突变幅度等)中。 结果如下图所示, 文…