python如何比较两个列表_如何在Python中检查两个列表是否循环相同?

Python方面的知识还不足以用所要求的语言来回答这个问题,但是在C/C++中,考虑到问题的参数,会将零和1转换为位#include "stdafx.h"

#include "stdafx.h"

#include

#include

#include

#include

const uint8_t LIST_LENGTH = 55; // uint_8 supports full witdth of SIMD and AVX2

// max left shifts is 32, so must use right shifts to create head_bit

const uint64_t head_bit = (0x8000000000000000 >> (64 - LIST_LENGTH));

const uint64_t CPU_FREQ = 3840000000; // turbo-mode clock freq of my i7 chip

const uint64_t LOOP_KNT = 688275225; // 26235^2 // 1000000000;

// ----------------------------------------------------------------------------

__inline uint8_t is_circular_identical(const uint64_t anchor_ring, uint64_t test_ring)

{

// By trial and error, try to synch 2 circular lists by holding one constant

// and turning the other 0 to LIST_LENGTH positions. Return compare count.

// Return the number of tries which aligned the circularly identical rings,

// where any non-zero value is treated as a bool TRUE. Return a zero/FALSE,

// if all tries failed to find a sequence match.

// If anchor_ring and test_ring are equal to start with, return one.

for (uint8_t i = LIST_LENGTH; i; i--)

{

// This function could be made bool, returning TRUE or FALSE, but

// as a debugging tool, knowing the try_knt that got a match is nice.

if (anchor_ring == test_ring) { // test all 55 list members simultaneously

return (LIST_LENGTH +1) - i;

}

if (test_ring % 2) { // ring's tail is 1 ?

test_ring /= 2; // right-shift 1 bit

// if the ring tail was 1, set head to 1 to simulate wrapping

test_ring += head_bit;

} else { // ring's tail must be 0

test_ring /= 2; // right-shift 1 bit

// if the ring tail was 0, doing nothing leaves head a 0

}

}

// if we got here, they can't be circularly identical

return 0;

}

// ----------------------------------------------------------------------------

int main(void) {

time_t start = clock();

uint64_t anchor, test_ring, i, milliseconds;

uint8_t try_knt;

anchor = 31525197391593472; // bits 55,54,53 set true, all others false

// Anchor right-shifted LIST_LENGTH/2 represents the average search turns

test_ring = anchor >> (1 + (LIST_LENGTH / 2)); // 117440512;

printf("\n\nRunning benchmarks for %llu loops.", LOOP_KNT);

start = clock();

for (i = LOOP_KNT; i; i--) {

try_knt = is_circular_identical(anchor, test_ring);

// The shifting of test_ring below is a test fixture to prevent the

// optimizer from optimizing the loop away and returning instantly

if (i % 2) {

test_ring /= 2;

} else {

test_ring *= 2;

}

}

milliseconds = (uint64_t)(clock() - start);

printf("\nET for is_circular_identical was %f milliseconds."

"\n\tLast try_knt was %u for test_ring list %llu",

(double)milliseconds, try_knt, test_ring);

printf("\nConsuming %7.1f clocks per list.\n",

(double)((milliseconds * (CPU_FREQ / 1000)) / (uint64_t)LOOP_KNT));

getchar();

return 0;

}

1620

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值