Leaving aside hashing and suchlike, we've used this for a while in multiple
places.
It's a ripoff of the C binsrch algorithm in the Tenenbaum data structures book,
so there's nothing ~that~ proprietary about it.
I edited it to take out our specific stuff, so check carefully as I may have
missed a variable.
I'm sure it's easy to rip apart from an elegance standpoint, but it does what
it says on the tin well enough.
I removed all our site specific macros, so you should be able to adapt it
easily enough.
***********************************************************************
* BINARY SEARCH FOR REQUESTED TABLE ENTRY *
* NTRY: R1: KEY TO FIND *
* EXIT: FULL: A(RECORD) - CC:EQ *
* FULL: A(INSERTION POINT) - CC:NEQ *
***********************************************************************
SPACE 1
BSRCH <use your favorite register preserving macro>
LR R4,R1 R4 = A(KEYARG)
L R5,=A(YOUR TABLE) R5 = A(START OF DATA)
L R0,=A(length of table) R0 = LENGTH OF DATA IN
BUFFER
SRDL R0,32
*
LHI RF,l'single entry RF = LENGTH OF SINGLE ENTRY
DR R0,RF
CHI R1,6
BL SQSRCH LESS THAN 6 - DO SEQUENTIAL SEARCH
*
XR R0,R0 R0 = LOW
BCTR R1,0 R1 = HIGH
LHI RE,l'key-1 RE = L'KEY-1
*
BSRCH02 CR R0,R1 WHILE LOW <= HIGH
BH BSRCH04 R0 POINTS TO INSERTION POINT
*
LR R3,R0 R3 = MID
AR R3,R1
SRL R3,1 MID=(HIGH+LOW)/2
*
LR RF,R3
MH RF,ISKEYLN4
AR RF,R5 RF=A(TEST ENTRY)
*
EX RE,BSMTCH TRY TO MATCH KEY
BE BSXIT KEY == K(MID)
*
BL *+12
LA R0,1(R3) IF CC HIGH : LOW = MID+1
B BSRCH02
*
LR R1,R3 IF CC LOW : HIGH = MID-1;
BCTR R1,0
B BSRCH02
*
BSRCH04 LR RF,R0
MH RF,ISKEYLN4
AR RF,R5
B BSXIT
*
SQSRCH L RF,=A(YOUR TABLE)
L R1,=A(YOUR TABLE)
A R1,=a(l'table)
AHI R1,l'entry R1 = A(LAST ENTRY)
*
LHI R0,l'entry R0 = L'ENTRY
LHI RE,l'key-1 RE = L'KEY-1
*
SSRCH02 EX RE,BSMTCH TRY TO MATCH KEY
BNH BSXIT
BXLE RF,R0,SSRCH02
DC H'0'
*
BSMTCH CLC 0(0,R4),0(RF) COMPARE REQUESTED KEY WITH RECORD
*
BSXIT ST RF,FULL
<restore your registers>
-----Original Message-----
From: IBM Mainframe Assembler List [mailto:[email protected]] On
Behalf Of Rob van der Heij
Sent: Monday, October 21, 2013 7:50 AM
To: [email protected]
Subject: Re: Linear search vs binary
If you want to make it 4096 entries, you could step through the table with
binary search very cheap by shifting a mask on each pass. I would already think
about it with 35 entries... ;-)
On 21 October 2013 13:32, Dougie Lawson <[email protected]> wrote:
> If I have a table of 3,500 entries of twelve bytes (I'm doing a
> compare of eight bytes to find the entry I'm looking for and a check
> on a half word marker for the end of the table to avoid running off
> the end) then is it worth the pain of re-writing it as a binary search.
>
> If it is worth the pain and does anyone have a sample binary search
> tucked away.
>
> The table is built into a CSECT at the bottom of my code. I can
> restructure it if we need any special pointers to make a binary search work.
>
> Dougie
>